似乎你没有听说过有关简化与oauth2提供商合作的spring-cloud-security项目。看一看:
http://cloud.spring.io/spring-cloud-security/
有在github上(如上页的右侧)提供样品。它显示了如何设置以防止只使用一个oauth2提供程序 - 检查显示如何为github执行此操作的项目https://github.com/spring-cloud-samples/sso。你通过配置application.yml
文件+添加@EnableOAuth2Sso
注释来完成大部分这些工作,以便所有机器启动。
对于与您的Web应用程序进行“正常”交互,它非常直观。如果你需要你的应用程序作为其他人的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提供商可以提供授权用户交换春季安全核心扩展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("/");
}
所以/管理员现在将保护和用户重定向到您指定的任何授权服务器。它需要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
这就是为什么我之前写过它只能使用一个auhorization服务器,但如果您需要更多,那么它更复杂。
谢谢@freakman,我实际上看到了这一点,但不幸的是我不幸回答了我的查询。可以使用Oauth2来代替标准的弹簧安全性,而不使用restfull调用,即浏览器在非restfull方法下进行的正常调用。或者应该将它作为一个独立的实体来实现(仅限于api调用)(请注意,我们不会使用第三方授权者,我们希望创建自己的服务器并将其连接到它的 – Aeseir
它可以用来保护您的控制器为'正常'弹簧安全 - 这个例子显示了这个:https://github.com/spring-cloud-samples/sso。更新内容。 – freakman