2015-10-22 125 views
2

我有一个查询我正在努力得到一个体面的答案,并希望通过发声有人可能能够引导我或在正确的方向提醒我。Web应用程序的弹簧Oauth

我们所有当前的Web应用程序都是使用Spring构建的,其中包括当然由Spring Security模块处理的安全性。 我们正在探索将我们的一些新的android项目集成到这些web应用程序中的机会。

经过一番研究和指导,所有标志都指向Android App中的OAuth2实现,并使用它通过Restfull调用获取对Web应用程序服务器的相关部分的访问权限。

我现在想明白的是,我们是否应该在我们的Web应用程序中替换现有的Spring Security实现,并将其替换为Spring Oauth2等价物。

总体目标是能够有一个单一的安全解决方案,我们将用于网站登录,应用程序登录以及任何可能暴露给其他Web应用程序的API实现。

如果任何人都可以提供一个链接到Spring Oauth2 Java配置(非XML)设置,用户登录并以不稳定的方式根据角色访问页面,这也是非常有用的。我们发现的大多数例子都非常复杂,仅仅关注restfull调用,或者只关注XML配置。

回答

0

似乎你没有听说过有关简化与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服务器,但如果您需要更多,那么它更复杂。

+0

谢谢@freakman,我实际上看到了这一点,但不幸的是我不幸回答了我的查询。可以使用Oauth2来代替标准的弹簧安全性,而不使用restfull调用,即浏览器在非restfull方法下进行的正常调用。或者应该将它作为一个独立的实体来实现(仅限于api调用)(请注意,我们不会使用第三方授权者,我们希望创建自己的服务器并将其连接到它的 – Aeseir

+0

它可以用来保护您的控制器为'正常'弹簧安全 - 这个例子显示了这个:https://github.com/spring-cloud-samples/sso。更新内容。 – freakman

相关问题