Spring Security Java 配置预览:OAuth

工程 | Rob Winch | 2013年7月5日 | ...

这是我的五篇系列博客文章的第四篇,介绍了 Spring Security Java 配置。在这篇文章中,我们将通过 Spring Security OAuth Java 配置支持来讨论如何扩展 Spring Security Java 配置。

概念验证

虽然 Spring Security Java 配置对于非常基本的配置效果很好,但这只是一个概念验证。我们尚未确保 XML 命名空间中所有可用的功能都存在于其 Java 配置支持中。确保 Spring Security 的 Java 配置能够很好地与 Spring 扩展一起工作非常重要。但是,我们不想等到在扩展中实现所有配置功能后再发布 Spring Security Java 配置。将来,我们计划巩固 Spring Security OAuth Java 配置,但目前它更像是一个概念验证,而不是一个完整的解决方案。

HelloOAuth2ServerConfiguration

Spring Security 的 OAuth Java 配置支持基本的 OAuth 2 服务器配置。其最简单的形式如下所示:


@Configuration
@EnableWebSecurity
public class HelloOAuth2ServerConfiguration 
   extends OAuth2ServerConfigurerAdapter {
    private static final String RESOURCE_ID = "photos";

    
  @Autowired
  public void registerGlobal(AuthenticationManagerBuilder auth) throws Exception {
      auth
            .apply(new InMemoryClientDetailsServiceConfigurer())
                .withClient("my-client")
                    .resourceIds(RESOURCE_ID)
                    .authorizedGrantTypes("authorization_code","implicit")
                    .authorities("ROLE_USER")
                    .scopes("read","write")
                    .secret("secret");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeUrls()
                .anyRequest().authenticated()
                .and()
            .apply(new OAuth2ServerConfigurer())
                .resourceId(RESOURCE_ID);
    }
}

通过此配置,我们现在能够处理 OAuth 请求。但是,它有一些限制,在许多情况下无法正常工作。

  • 如果用户正在使用 OAuth 服务器批准请求,我们仍然需要一个处理“/oauth/confirm_access”的控制器。
  • 无法使用用户而不是 OAuth 客户端进行身份验证,这意味着用户无法确认访问权限。
  • 授权映射到已进行身份验证,这充其量是对授权的简单实现。

SecurityConfigurer

撇开这些问题不谈,让我们来看看发生了什么。OAuth2ServerConfigurer 是 SecurityConfigurer 的一个实例。在实现 SecurityConfigurer 时,建议扩展 SecurityConfigurerAdapter,它是 SecurityConfigurer 的基本实现。

通过允许 HttpSecurity 接受 SecurityConfigurer,我们可以添加扩展(如 OAuth),这些扩展可以更复杂的方式更新 HttpSecurity 对象。事实上,像 HttpSecurity.formLogin() 这样的方法也是使用 SecurityConfigurerAdapter 实现来实现的。不同之处在于它们是 Spring Security 核心模块的一部分,因此有一些方便的方法可以为我们执行 apply(SecurityConfigurerAdapter)。

我们不仅可以将 SecurityConfigurer 应用于 HttpSecurity 对象,还可以将其应用于 AuthenticationManagerBuilder。InMemoryClientDetailsServiceConfigurer 就说明了这一点。这意味着身份验证机制也可以轻松扩展。

这对您意味着什么?假设您有一个更复杂的 Security 配置,并希望在公司内部共享它。您可以允许工程师在任何地方复制粘贴配置。或者,您可以创建您自己的 SecurityConfigurerAdapter 实现,允许开发人员专注于您公司的自定义 DSL。

其他 OAuth 示例

我们提供的示例配置非常简单,但它并没有说明在更实际的情况下该怎么做。在我们觉得 OAuth 支持得到进一步巩固之前,我们不会对此进行博客记录。但是,有一些额外的示例可以帮助您入门,如果您想尝试一下。

请反馈

如果您遇到错误,有改进的想法等,请随时提出!我们想听听您的想法,以便确保在代码普遍可用之前将其纠正。尽早尝试新功能是回馈社区的一种简单而有效的方法。这也确保了您想要的特性存在并按照您认为应该的方式工作。

请在“Java 配置”类别下将任何问题或功能请求记录到Spring Security JIRA。记录 JIRA 后,我们鼓励(但不要求)您在拉取请求中提交更改。您可以在贡献者指南中阅读更多关于如何执行此操作的信息。

如果您对如何执行某些操作有疑问,请使用Spring Security 论坛带有 spring-security 标签的 Stack Overflow(我将密切关注它们)。如果您对这篇博客有具体的评论或问题,请随时留下评论。使用合适的工具将使每个人都更容易。

结论

Spring Security Java 配置使用 OAuth 支持作为概念验证,以确保它已准备好进行扩展。随着时间的推移,OAuth 支持将被巩固为 XML 配置的替代方案。在我的上一篇文章中,我讨论了 Spring Security Java 配置的可读性。

获取 Spring 电子简讯

与 Spring 电子简讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加快您的进度。

了解更多

获得支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部