【问题标题】:Spring Oauth for Web Application用于 Web 应用程序的 Spring Oauth
【发布时间】:2016-01-21 08:45:49
【问题描述】:

我有一个疑问,我正在努力得到一个体面的答案,并希望通过说出它,有人可能能够指导我或建议我朝正确的方向前进。

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您似乎没有听说过 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
    

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

    【讨论】:

    • 谢谢@freakman,我实际上看到了这个,但不幸的是没有帮助回答我的问题。 Oauth2 是否可以在不使用 restfull 调用的情况下替换标准 spring 安全性,即浏览器在 non-restfull 方法下进行的正常调用。或者它是否应该作为一个单独的实体来实现,仅用于 api 调用(注意我们不会使用第 3 方授权者。我们想创建自己的服务器来连接)
    • 它可以用来保护你的控制器作为“正常”的弹簧安全——这个例子显示了这一点:github.com/spring-cloud-samples/sso。更多内容在更新中。
    猜你喜欢
    • 2014-05-13
    • 1970-01-01
    • 2017-08-24
    • 2012-06-19
    • 2023-02-22
    • 2011-02-03
    • 2015-12-25
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多