您似乎没有听说过 spring-cloud-security 项目,它极大地简化了与 oauth2 提供商的合作。看看:
http://cloud.spring.io/spring-cloud-security/
github 上有可用的示例(上页右侧)。它显示了如何设置以防您只想使用一个 oauth2 提供程序 - 检查项目,该项目显示如何为 github https://github.com/spring-cloud-samples/sso 执行此操作。您可以通过 application.yml 文件中的配置 + 添加 @EnableOAuth2Sso 注释来完成大部分工作,以便所有机器启动。
对于与您的网络应用程序的“正常”交互,它非常简单。如果您需要您的应用程序作为其他人的 api 工作,那么您必须维护令牌,将它们添加到请求等。如果您的 api 客户端也是您可以更改的代码,那么您可以使用 OAuth2RestTemplate 类来照顾令牌,因此您可以像通常/不安全的端点那样对您的 api 进行查询。
如果您需要为不同的路径使用例如两个不同的提供程序,那么它会更复杂,您必须像这样配置它们:
@Bean
public OAuth2RestTemplate facebookOAuth2RestTemplate(OAuth2ClientContext clientContext) {
return new OAuth2RestTemplate(facebookOAuth2ResourceDetails(), clientContext);
}
@Bean
public OAuth2ProtectedResourceDetails facebookOAuth2ResourceDetails() {
AuthorizationCodeResourceDetails resource = new AuthorizationCodeResourceDetails();
resource.setAccessTokenUri(tokenUri);
resource.setId("id");
resource.setUserAuthorizationUri(authorizationUri);
resource.setUseCurrentUri(false);
resource.setPreEstablishedRedirectUri(redirectUri);
resource.setClientId(clientId);
resource.setClientSecret(clientSecret);
resource.setTokenName("tokenname");
resource.setAuthenticationScheme(AuthenticationScheme.query);
resource.setClientAuthenticationScheme(AuthenticationScheme.form);
return resource;
}
并决定在哪种情况下使用OAuth2RestTemplate 的哪个实例。
//更新
如果您想通过某些 oauth2 提供者与授权用户交换 spring 安全核心,您可以扩展 OAuth2SsoConfigurerAdapter 类:
@Configuration
@EnableOAuth2Sso
public class WebSecurityConfig extends OAuth2SsoConfigurerAdapter {
@Override
public void match(RequestMatchers matchers) {
matchers.antMatchers("/admin");
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin").hasRole("ADMIN")
.and()
.logout().logoutUrl("/logout").permitAll()
.logoutSuccessUrl("/");
}
因此 /admin 现在将受到保护,并且用户将重定向到您指定的任何授权服务器。它需要在application.yml 中进行oauth 配置。
spring:
oauth2:
client: # Sauron
clientId: app_clientid
clientSecret: app_secret
accessTokenUri: http://authorizationserver/oauth/token
userAuthorizationUri: http://authorizationserver/oauth/authorize
clientAuthenticationScheme: header
resource:
tokenInfoUri: http://authorizationserver/oauth/check_token
preferTokenInfo: false
这就是为什么我之前写过它很容易使用只有一个授权服务器,但如果你需要更多,那么它就更复杂了。