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" 的 Controller。
  • 无法使用用户而非 OAuth 客户端进行身份验证,这意味着用户无法确认访问权限。
  • 授权被映射为已通过身份验证,这充其量只是一种简单的授权实现。

SecurityConfigurer

抛开这些问题,让我们来看看正在发生的事情。OAuth2ServerConfigurer 是 SecurityConfigurer 的一个实例。实现 SecurityConfigurer 时,建议扩展 SecurityConfigurerAdapter,它是 SecurityConfigurer 的一个基础实现。

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

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

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

更多 OAuth 示例

我们提供的示例配置非常简单,但它未能展示在更实际情况下如何操作。在我们觉得 OAuth 支持进一步巩固之前,我们不会撰写关于这些内容的博客。但是,如果你希望尝试一下,还有其他示例可以帮助你入门。

请提供反馈

如果你遇到 Bug、有改进想法等,请不要犹豫提出来!我们希望听取你的意见,以便在代码正式发布之前确保一切正确。尽早试用新功能是回馈社区的一种良好而简单的方式。这也确保了你想要的功能存在并能按你期望的方式工作。

请将任何问题或功能请求记录到 Spring Security JIRA 中,类别选择 "Java Config"。记录 JIRA 后,我们鼓励(但非强制)你提交拉取请求来提供你的修改。你可以在 贡献者指南 中阅读更多关于如何操作的信息。

如果你对如何做某事有疑问,请使用 Spring Security 论坛 或在 Stack Overflow 上使用 spring-security 标签提问(我会密切关注这些地方)。如果你对这篇博客有具体的评论或问题,欢迎留言。使用适当的工具将有助于让每个人都更容易。

结论

Spring Security Java 配置使用了 OAuth 支持作为概念验证,以确保其已准备好进行扩展。未来,OAuth 支持将得到巩固,并成为 XML 配置的替代方案。在我的上一篇博文中,我讨论了 Spring Security Java 配置的可读性。

订阅 Spring 新闻邮件

通过 Spring 新闻邮件保持联系

订阅

领先一步

VMware 提供培训和认证,为你的进步注入强劲动力。

了解更多

获取支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,仅需一份简单订阅即可。

了解更多

即将举行的活动

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

查看全部