我们有一个项目负责成为oauth2提供商的代理。其中大多数是常见的,如facebook,twitter,但其中一个是我们公司特有的。所以我们有几个:
@Bean
public OAuth2RestTemplate providerOAuth2RestTemplate(OAuth2ClientContext clientContext) {
OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(providerOAuth2ResourceDetails(), clientContext);
return oAuth2RestTemplate;
}
@Bean
public OAuth2ProtectedResourceDetails providerOAuth2ResourceDetails() {
AuthorizationCodeResourceDetails resource = new AuthorizationCodeResourceDetails();
resource.setAccessTokenUri(tokenUri);
resource.setUserAuthorizationUri(authorizationUri);
resource.setUseCurrentUri(false);
resource.setPreEstablishedRedirectUri(redirectUri);
resource.setClientId(clientId);
resource.setClientAuthenticationScheme(clientAuthenticationScheme);
resource.setClientSecret(clientSecret);
return resource;
}
我们正在使用它们,具体取决于我们的代理中的url请求。我们做了一些事情,然后打电话给:
providerOAuth2RestTemplate.getAccessToken();
以上所有作品! :)它要求提供商登录,例如从Facebook等显示正确的表单。
但是,我们希望为我们的代理添加spring security以添加一些管理站点等。并且存在问题。 每当我们打电话时:
providerOAuth2RestTemplate.getAccessToken();
我们从代理系统获取登录页面,而不是调用oauth2提供程序。所以它知道登录需要获取访问令牌,但调用不同的登录..; )
Spring安全基本设置:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER").and()
.withUser("admin").password("password").roles("ADMIN");
}
@Override
public void configure(WebSecurity webSecurity) {
webSecurity
.ignoring()
.antMatchers("img/**");
}
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.authorizeRequests()
.antMatchers("/admin").hasRole("ADMIN")
.anyRequest().permitAll()
.and()
.formLogin()
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/logoutSuccess")
.invalidateHttpSession(true);
}
}