Skip to content

Commit 219f192

Browse files
author
Dave Syer
committed
Manually create config for @EnableOAuth2Sso
1 parent 5e577ed commit 219f192

File tree

4 files changed

+70
-16
lines changed

4 files changed

+70
-16
lines changed

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424
</properties>
2525

2626
<dependencies>
27+
<dependency>
28+
<groupId>org.springframework.boot</groupId>
29+
<artifactId>spring-boot-configuration-processor</artifactId>
30+
<optional>true</optional>
31+
</dependency>
2732
<dependency>
2833
<groupId>org.springframework.boot</groupId>
2934
<artifactId>spring-boot-starter-actuator</artifactId>

src/main/java/com/example/SocialApplication.java

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,25 @@
2525
import javax.servlet.http.HttpServletRequest;
2626
import javax.servlet.http.HttpServletResponse;
2727

28+
import org.springframework.beans.factory.annotation.Autowired;
2829
import org.springframework.boot.SpringApplication;
2930
import 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;
3136
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
3237
import 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;
3347
import org.springframework.security.web.csrf.CsrfFilter;
3448
import org.springframework.security.web.csrf.CsrfToken;
3549
import org.springframework.security.web.csrf.CsrfTokenRepository;
@@ -40,9 +54,12 @@
4054
import org.springframework.web.util.WebUtils;
4155

4256
@SpringBootApplication
43-
@EnableOAuth2Sso
4457
@RestController
58+
@EnableOAuth2Client
4559
public class SocialApplication extends WebSecurityConfigurerAdapter {
60+
61+
@Autowired
62+
OAuth2ClientContext oauth2ClientContext;
4663

4764
@RequestMapping("/user")
4865
public 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

6584
public static void main(String[] args) {
6685
SpringApplication.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+
69117
private Filter csrfHeaderFilter() {
70118
return new OncePerRequestFilter() {
71119
@Override

src/main/resources/application.yml

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
security:
2-
oauth2:
3-
client:
4-
clientId: 233668646673605
5-
clientSecret: 33b17e044ee6a4fa383f46ec6e28ea1d
6-
accessTokenUri: https://graph.facebook.com/oauth/access_token
7-
userAuthorizationUri: https://www.facebook.com/dialog/oauth
8-
tokenName: oauth_token
9-
authenticationScheme: query
10-
clientAuthenticationScheme: form
11-
resource:
12-
userInfoUri: https://graph.facebook.com/me
1+
facebook:
2+
client:
3+
clientId: 233668646673605
4+
clientSecret: 33b17e044ee6a4fa383f46ec6e28ea1d
5+
accessTokenUri: https://graph.facebook.com/oauth/access_token
6+
userAuthorizationUri: https://www.facebook.com/dialog/oauth
7+
tokenName: oauth_token
8+
authenticationScheme: query
9+
clientAuthenticationScheme: form
10+
resource:
11+
userInfoUri: https://graph.facebook.com/me
1312

1413
logging:
1514
level:

src/main/resources/static/index.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
<body ng-app="app" ng-controller="home as home">
1717
<h1>Login</h1>
1818
<div class="container" ng-show="!home.authenticated">
19-
With Facebook: <a href="/login">click here</a>
19+
<div>
20+
With Facebook: <a href="/login/facebook">click here</a>
21+
</div>
2022
</div>
2123
<div class="container" ng-show="home.authenticated">
2224
Logged in as: <span ng-bind="home.user"></span>

0 commit comments

Comments
 (0)