用于Web应用程序的Spring Oauth

时间:2015-10-22 06:41:13

标签: spring spring-security spring-security-oauth2

我有一个问题,我正在努力找到一个体面的答案,并希望通过发声有人可能能够指导我或建议我朝着正确的方向。

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

经过一些研究和指导,所有标记都指向Android应用程序中的OAuth2实现,并使用它来通过Restfull调用访问Web应用程序服务器的相关部分。

我现在想要了解的是,我们是否应该在Web应用程序中替换现有的Spring Security实现,并将其替换为Spring Oauth2等效。

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

如果任何人还可以提供指向Spring Oauth2 Java Config(非XML)设置的链接,其中用户以不可靠的方式登录并基于他们的角色访问页面,这也将非常有用。我们发现的大多数示例要么非常复杂,要么只关注restfull调用,要么只关注XML配置。

1 个答案:

答案 0 :(得分:0)

似乎你没有听说过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授权用户交换spring security core,您可以扩展OAuth2SsoConfigurerAdapter class:

@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

这就是为什么我之前写过它很容易使用一个授权服务器,但如果你需要更多,那么它就更复杂了。