2525import javax .servlet .http .HttpServletRequest ;
2626import javax .servlet .http .HttpServletResponse ;
2727
28+ import org .springframework .beans .factory .annotation .Autowired ;
2829import org .springframework .boot .SpringApplication ;
2930import org .springframework .boot .autoconfigure .SpringBootApplication ;
30- import org .springframework .boot .autoconfigure .security .oauth2 .client .EnableOAuth2Sso ;
31+ import org .springframework .boot .autoconfigure .security .oauth2 .resource .ResourceServerProperties ;
32+ import org .springframework .boot .autoconfigure .security .oauth2 .resource .UserInfoTokenServices ;
33+ import org .springframework .boot .context .embedded .FilterRegistrationBean ;
34+ import org .springframework .boot .context .properties .ConfigurationProperties ;
35+ import org .springframework .context .annotation .Bean ;
3136import org .springframework .security .config .annotation .web .builders .HttpSecurity ;
3237import org .springframework .security .config .annotation .web .configuration .WebSecurityConfigurerAdapter ;
38+ import org .springframework .security .oauth2 .client .OAuth2ClientContext ;
39+ import org .springframework .security .oauth2 .client .OAuth2RestTemplate ;
40+ import org .springframework .security .oauth2 .client .filter .OAuth2ClientAuthenticationProcessingFilter ;
41+ import org .springframework .security .oauth2 .client .filter .OAuth2ClientContextFilter ;
42+ import org .springframework .security .oauth2 .client .resource .OAuth2ProtectedResourceDetails ;
43+ import org .springframework .security .oauth2 .client .token .grant .code .AuthorizationCodeResourceDetails ;
44+ import org .springframework .security .oauth2 .config .annotation .web .configuration .EnableOAuth2Client ;
45+ import org .springframework .security .web .authentication .LoginUrlAuthenticationEntryPoint ;
46+ import org .springframework .security .web .authentication .www .BasicAuthenticationFilter ;
3347import org .springframework .security .web .csrf .CsrfFilter ;
3448import org .springframework .security .web .csrf .CsrfToken ;
3549import org .springframework .security .web .csrf .CsrfTokenRepository ;
4054import org .springframework .web .util .WebUtils ;
4155
4256@ SpringBootApplication
43- @ EnableOAuth2Sso
4457@ RestController
58+ @ EnableOAuth2Client
4559public class SocialApplication extends WebSecurityConfigurerAdapter {
60+
61+ @ Autowired
62+ OAuth2ClientContext oauth2ClientContext ;
4663
4764@ RequestMapping ("/user" )
4865public Principal user (Principal principal ) {
@@ -56,16 +73,47 @@ protected void configure(HttpSecurity http) throws Exception {
5673.authorizeRequests ()
5774.antMatchers ("/" , "/login**" , "/webjars/**" ).permitAll ()
5875.anyRequest ().authenticated ()
76+ .and ().exceptionHandling ().authenticationEntryPoint (new LoginUrlAuthenticationEntryPoint ("/" ))
5977.and ().logout ().logoutSuccessUrl ("/" ).permitAll ()
6078.and ().csrf ().csrfTokenRepository (csrfTokenRepository ())
61- .and ().addFilterAfter (csrfHeaderFilter (), CsrfFilter .class );
79+ .and ().addFilterAfter (csrfHeaderFilter (), CsrfFilter .class )
80+ .addFilterBefore (ssoFilter (), BasicAuthenticationFilter .class );
6281// @formatter:on
6382}
6483
6584public static void main (String [] args ) {
6685SpringApplication .run (SocialApplication .class , args );
6786}
6887
88+ @ Bean
89+ public FilterRegistrationBean oauth2ClientFilterRegistration (
90+ OAuth2ClientContextFilter filter ) {
91+ FilterRegistrationBean registration = new FilterRegistrationBean ();
92+ registration .setFilter (filter );
93+ registration .setOrder (-100 );
94+ return registration ;
95+ }
96+
97+ private Filter ssoFilter () {
98+ OAuth2ClientAuthenticationProcessingFilter facebookFilter = new OAuth2ClientAuthenticationProcessingFilter ("/login/facebook" );
99+ OAuth2RestTemplate facebookTemplate = new OAuth2RestTemplate (facebook (), oauth2ClientContext );
100+ facebookFilter .setRestTemplate (facebookTemplate );
101+ facebookFilter .setTokenServices (new UserInfoTokenServices (facebookResource ().getUserInfoUri (), facebook ().getClientId ()));
102+ return facebookFilter ;
103+ }
104+
105+ @ Bean
106+ @ ConfigurationProperties ("facebook.client" )
107+ OAuth2ProtectedResourceDetails facebook () {
108+ return new AuthorizationCodeResourceDetails ();
109+ }
110+
111+ @ Bean
112+ @ ConfigurationProperties ("facebook.resource" )
113+ ResourceServerProperties facebookResource () {
114+ return new ResourceServerProperties ();
115+ }
116+
69117private Filter csrfHeaderFilter () {
70118return new OncePerRequestFilter () {
71119@ Override
0 commit comments