Pivotal 正式发布 Spring Security 5.0.0,是 2015 年 3 月发布 4.0.0 版本以来的第一个大版本。
Spring Security 诞生于 2004 年,当时叫作 Acegi,现在由 Pivotal 工程师 Robert Winch 领导开发,Robert 是 _Spring Security_ 和 _Spring Security 3.1_ 的合著者。5.0.0 版本包含了 400 多项改进和问题修复,包括支持 OAuth 2.0、支持 Spring WebFlux、可以使用 Reactor 的 StepVerifier 进行测试。
InfoQ 就 Spring Security 5.0.0 版本的发布和未来计划问题采访了 Robert Winch。
InfoQ:新版本的更新站点看起来很稳定。你能概括一下这一版本的内容吗?
Winch:Spring Security 5.0.0 的主要亮点在于它只需要最小化的 JDK 8、反应式安全特性、OAuth 2.0(OIDC)和现代密码存储。
InfoQ:你们是怎么想到现代密码存储这个主意的?又是如何实现的?
Winch:在 Spring Security 5.0.0 之前,密码是明文保存,十分不安全。因为这一次发布的是大版本,所以我们决定使用更安全的密码存储方式。 我们有幸与密码存储专家 John Steven 合作,他是 OWASP 密码存储手册的主要作者。Spring Security 现在默认提供的是最新的密码存储方式。当然,我们也可以使用其他方式来存储密码。
InfoQ:Spring 让我印象深刻的地方在于,它总是能够急我们之所急,为我们提供我们缺失的功能。你们是如何决定推出哪些特性的?
Winch:我们关注社区进展,为呼声较高的问题制定解决方案。结果就是要使用最小化的 JDK 8,并通过 Reactor 项目来支持反应式编程。
InfoQ:你们打算加快 Spring Security 的发布速度吗?就像 Juergen Hoeller 所说的那样,在更短的时间周期内交付已经准备好的特性?
Winch:是的。Spring Security 尝试跟上 Spring 框架的脚步,确保为 Spring 框架提供安全保护。
InfoQ:下一个版本的计划是什么?
Winch:下一版本,我们计划把精力集中在完善反应式和 OAuth 上面。我们也会提供一些工具用于迁移现有的密码。我们也希望能够发布初始版本的 OAuth 资源服务器。
现在让我们来看看增强的方法级别的安全(示例来自 Spring Security 网站)。
可以使用 @EnableGlobalMethodSecurity 来启用基于注解的安全,只要这个类也使用了 @Configuration。例如:
@Configuration @EnableGlobalMethodSecurity(securedEnabled = true) public class MethodSecurityConfig { // ... }
然后就可以实现方法级别的安全:
public interface BankService { @Secured("IS_AUTHENTICATED_ANONYMOUSLY") public Account readAccount(Long id); @Secured("IS_AUTHENTICATED_ANONYMOUSLY") public Account[] findAccounts(); @Secured("ROLE_TELLER") public Account post(Account account, double amount); }
有时候可能需要比 GlobalMethodSecurity 更灵活的方式,那么可以通过扩展 GlobalMethodSecurityConfiguration 来实现自定义安全策略,并在这个类上面加上 @EnableGlobalMethodSecurity:
@EnableGlobalMethodSecurity(prePostEnabled = true) public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration { @Override protected MethodSecurityExpressionHandler createExpressionHandler() { // ... create and return custom MethodSecurityExpressionHandler ... return expressionHandler; } }
Reactor 项目的反应式流有一个特性,它支持将等待中的线程分配给新的任务作业,这就给实现 ThreadLocal 类型映射带来了新的挑战。Reactor 为此提供了 Context API ,它是一种反应式的 ThreadLocal map。
在 5.0.0 版本里,可以通过 ReactiveSecurityContextHolder.getContext() 方法访问反应式 Context,并在方法调用过程中使用 token(以及其他应用程序相关数据)。
查看英文原文: Spring Security 5.0.0 Released
评论