1818import java .io .IOException ;
1919import java .security .Principal ;
2020import java .util .ArrayList ;
21+ import java .util .LinkedHashMap ;
2122import java .util .List ;
23+ import java .util .Map ;
2224
2325import javax .servlet .Filter ;
2426import javax .servlet .FilterChain ;
3537import org .springframework .boot .context .embedded .FilterRegistrationBean ;
3638import org .springframework .boot .context .properties .ConfigurationProperties ;
3739import org .springframework .context .annotation .Bean ;
40+ import org .springframework .context .annotation .Configuration ;
41+ import org .springframework .core .annotation .Order ;
3842import org .springframework .security .config .annotation .web .builders .HttpSecurity ;
3943import org .springframework .security .config .annotation .web .configuration .WebSecurityConfigurerAdapter ;
4044import org .springframework .security .oauth2 .client .OAuth2ClientContext ;
4347import org .springframework .security .oauth2 .client .filter .OAuth2ClientContextFilter ;
4448import org .springframework .security .oauth2 .client .resource .OAuth2ProtectedResourceDetails ;
4549import org .springframework .security .oauth2 .client .token .grant .code .AuthorizationCodeResourceDetails ;
50+ import org .springframework .security .oauth2 .config .annotation .web .configuration .EnableAuthorizationServer ;
4651import org .springframework .security .oauth2 .config .annotation .web .configuration .EnableOAuth2Client ;
52+ import org .springframework .security .oauth2 .config .annotation .web .configuration .EnableResourceServer ;
53+ import org .springframework .security .oauth2 .config .annotation .web .configuration .ResourceServerConfigurerAdapter ;
4754import org .springframework .security .web .authentication .LoginUrlAuthenticationEntryPoint ;
4855import org .springframework .security .web .authentication .www .BasicAuthenticationFilter ;
4956import org .springframework .security .web .csrf .CsrfFilter ;
5966@ SpringBootApplication
6067@ RestController
6168@ EnableOAuth2Client
69+ @ EnableAuthorizationServer
70+ @ Order (6 )
6271public class SocialApplication extends WebSecurityConfigurerAdapter {
63-
72+
6473@ Autowired
6574OAuth2ClientContext oauth2ClientContext ;
6675
67- @ RequestMapping ("/user" )
68- public Principal user (Principal principal ) {
69- return principal ;
76+ @ RequestMapping ({ "/user" , "/me" })
77+ public Map <String , String > user (Principal principal ) {
78+ Map <String , String > map = new LinkedHashMap <>();
79+ map .put ("name" , principal .getName ());
80+ return map ;
7081}
7182
7283@ Override
@@ -84,6 +95,20 @@ protected void configure(HttpSecurity http) throws Exception {
8495// @formatter:on
8596}
8697
98+ @ Configuration
99+ @ EnableResourceServer
100+ protected static class ResourceServerConfiguration
101+ extends ResourceServerConfigurerAdapter {
102+ @ Override
103+ public void configure (HttpSecurity http ) throws Exception {
104+ // @formatter:off
105+ http
106+ .antMatcher ("/me" )
107+ .authorizeRequests ().anyRequest ().authenticated ();
108+ // @formatter:on
109+ }
110+ }
111+
87112public static void main (String [] args ) {
88113SpringApplication .run (SocialApplication .class , args );
89114}
@@ -97,57 +122,51 @@ public FilterRegistrationBean oauth2ClientFilterRegistration(
97122return registration ;
98123}
99124
100- private Filter ssoFilter () {
101- CompositeFilter filter = new CompositeFilter ();
102- List <Filter > filters = new ArrayList <>();
103- OAuth2ClientAuthenticationProcessingFilter facebookFilter = new OAuth2ClientAuthenticationProcessingFilter ("/login/facebook" );
104- OAuth2RestTemplate facebookTemplate = new OAuth2RestTemplate (facebook (), oauth2ClientContext );
105- facebookFilter .setRestTemplate (facebookTemplate );
106- facebookFilter .setTokenServices (new UserInfoTokenServices (facebookResource ().getUserInfoUri (), facebook ().getClientId ()));
107- filters .add (facebookFilter );
108- OAuth2ClientAuthenticationProcessingFilter githubFilter = new OAuth2ClientAuthenticationProcessingFilter ("/login/github" );
109- OAuth2RestTemplate githubTemplate = new OAuth2RestTemplate (github (), oauth2ClientContext );
110- githubFilter .setRestTemplate (githubTemplate );
111- githubFilter .setTokenServices (new UserInfoTokenServices (githubResource ().getUserInfoUri (), github ().getClientId ()));
112- filters .add (githubFilter );
113- filter .setFilters (filters );
114- return filter ;
115- }
116-
117125@ Bean
118- @ ConfigurationProperties ("facebook.client " )
119- OAuth2ProtectedResourceDetails facebook () {
120- return new AuthorizationCodeResourceDetails ();
126+ @ ConfigurationProperties ("github " )
127+ ClientResources github () {
128+ return new ClientResources ();
121129}
122130
123131@ Bean
124- @ ConfigurationProperties ("facebook.resource " )
125- ResourceServerProperties facebookResource () {
126- return new ResourceServerProperties ();
132+ @ ConfigurationProperties ("facebook" )
133+ ClientResources facebook () {
134+ return new ClientResources ();
127135}
128136
129- @ Bean
130- @ ConfigurationProperties ("github.client" )
131- OAuth2ProtectedResourceDetails github () {
132- return new AuthorizationCodeResourceDetails ();
137+ private Filter ssoFilter () {
138+ CompositeFilter filter = new CompositeFilter ();
139+ List <Filter > filters = new ArrayList <>();
140+ filters .add (ssoFilter (facebook (), "/login/facebook" ));
141+ filters .add (ssoFilter (github (), "/login/github" ));
142+ filter .setFilters (filters );
143+ return filter ;
133144}
134145
135- @ Bean
136- @ ConfigurationProperties ("github.resource" )
137- ResourceServerProperties githubResource () {
138- return new ResourceServerProperties ();
146+ private Filter ssoFilter (ClientResources client , String path ) {
147+ OAuth2ClientAuthenticationProcessingFilter facebookFilter = new OAuth2ClientAuthenticationProcessingFilter (
148+ path );
149+ OAuth2RestTemplate facebookTemplate = new OAuth2RestTemplate (client .getClient (),
150+ oauth2ClientContext );
151+ facebookFilter .setRestTemplate (facebookTemplate );
152+ facebookFilter .setTokenServices (new UserInfoTokenServices (
153+ client .getResource ().getUserInfoUri (), client .getClient ().getClientId ()));
154+ return facebookFilter ;
139155}
140156
141157private Filter csrfHeaderFilter () {
142158return new OncePerRequestFilter () {
143159@ Override
144- protected void doFilterInternal (HttpServletRequest request , HttpServletResponse response ,
145- FilterChain filterChain ) throws ServletException , IOException {
146- CsrfToken csrf = (CsrfToken ) request .getAttribute (CsrfToken .class .getName ());
160+ protected void doFilterInternal (HttpServletRequest request ,
161+ HttpServletResponse response , FilterChain filterChain )
162+ throws ServletException , IOException {
163+ CsrfToken csrf = (CsrfToken ) request
164+ .getAttribute (CsrfToken .class .getName ());
147165if (csrf != null ) {
148166Cookie cookie = WebUtils .getCookie (request , "XSRF-TOKEN" );
149167String token = csrf .getToken ();
150- if (cookie == null || token != null && !token .equals (cookie .getValue ())) {
168+ if (cookie == null
169+ || token != null && !token .equals (cookie .getValue ())) {
151170cookie = new Cookie ("XSRF-TOKEN" , token );
152171cookie .setPath ("/" );
153172response .addCookie (cookie );
@@ -165,3 +184,16 @@ private CsrfTokenRepository csrfTokenRepository() {
165184}
166185
167186}
187+
188+ class ClientResources {
189+ private OAuth2ProtectedResourceDetails client = new AuthorizationCodeResourceDetails ();
190+ private ResourceServerProperties resource = new ResourceServerProperties ();
191+
192+ public OAuth2ProtectedResourceDetails getClient () {
193+ return client ;
194+ }
195+
196+ public ResourceServerProperties getResource () {
197+ return resource ;
198+ }
199+ }
0 commit comments