对于最新的稳定版本,请使用 Spring Security 6.4.5spring-doc.cadn.net.cn

Spring Security 6.3 中的新增功能

Spring Security 6.3 提供了许多新功能。 以下是该版本的亮点,或者您可以查看发行说明,了解每项功能和错误修复的详细列表。spring-doc.cadn.net.cn

被动 JDK 序列化支持

在支持 JDK 序列化安全组件方面, Spring Security 历来非常激进,仅支持一个 Spring Security 次要版本的每个序列化版本。 这意味着,如果您有 JDK 序列化的安全组件,则需要在升级到下一个 Spring Security 版本之前撤离它们,因为它们将不再可反序列化。spring-doc.cadn.net.cn

现在 Spring Security 每 6 个月执行一次次要版本,这成为一个更大的痛点。 为了解决这个问题,Spring Security 现在将保持对 JDK 序列化的被动性,就像对 JSON 序列化所做的那样,从而实现更无缝的升级。spring-doc.cadn.net.cn

授权

最近几个版本的一个持续主题是重构和改进 Spring Security 的授权子系统。 首先将AccessDecisionManagerAPI 替换为AuthorizationManager现在已经到了我们能够添加几个令人兴奋的新功能的地步。spring-doc.cadn.net.cn

批注参数 - #14480

6.3 的第一个功能是支持 Comments 参数。 考虑一下 Spring Security 对元注释的支持,如下所示:spring-doc.cadn.net.cn

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@PreAuthorize("hasAuthority('SCOPE_message:read')")
public @interface HasMessageRead {}
Kotlin
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@PreAuthorize("hasAuthority('SCOPE_message:read')")
annotation class HasMessageRead

在此版本之前,仅当它在整个代码库中广泛使用时,此类内容才有用。 但现在,您可以添加如下参数spring-doc.cadn.net.cn

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@PreAuthorize("hasAuthority('SCOPE_{scope}')")
public @interface HasScope {
	String scope();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@PreAuthorize("hasAuthority('SCOPE_{scope}')")
annotation class HasScope (val scope:String)

使执行此类作成为可能:spring-doc.cadn.net.cn

@HasScope("message:read")
public String method() { ... }
@HasScope("message:read")
fun method(): String { ... }

并在更多位置应用 SpEL 表达式。spring-doc.cadn.net.cn

安全返回值 - #14596#14597

从 Spring Security 的早期开始,您就能够注释 Spring bean@PreAuthorize@PostAuthorize. 但是,控制器、服务和存储库并不是您唯一需要保护的东西。 例如,域对象呢Order其中只有管理员才能调用Order#getPayment方法?spring-doc.cadn.net.cn

现在在 6.3 中,您也可以对这些方法进行注释。 首先,注释getPayment方法:spring-doc.cadn.net.cn

public class Order {

	@HasScope("payment:read")
	Payment getPayment() { ... }

}
class Order {

	@HasScope("payment:read")
	fun getPayment(): Payment { ... }

}
public interface OrderRepository implements CrudRepository<Order, String> {

	@AuthorizeReturnObject
	Optional<Order> findOrderById(String id);

}
interface OrderRepository : CrudRepository<Order, String> {
    @AuthorizeReturnObject
    fun findOrderById(id: String?): Optional<Order?>?
}

此时,Spring Security 将保护任何Order返回自findOrderById通过代理Order实例.spring-doc.cadn.net.cn

错误处理 - #14598#14600#14601

在此版本中,您还可以使用其最后一个新方法安全注释在方法级别拦截和处理失败spring-doc.cadn.net.cn

public class Payment {
    @HandleAuthorizationDenied(handlerClass=Mask.class)
    @PreAuthorize("hasAuthority('card:read')")
    public String getCreditCardNumber() { ... }
}
class Payment {
    @HandleAuthorizationDenied(handlerClass=Mask.class)
    @PreAuthorize("hasAuthority('card:read')")
    fun getCreditCardNumber(): String { ... }
}

并发布一个Mask豆:spring-doc.cadn.net.cn

@Component
public class Mask implements MethodAuthorizationDeniedHandler {
	@Override
    public Object handleDeniedInvocation(MethodInvocation invocation, AuthorizationResult result) {
		return "***";
    }
}
@Component
class Mask : MethodAuthorizationDeniedHandler {
    fun handleDeniedInvocation(invocation: MethodInvocation?, result: AuthorizationResult?): Any = "***"
}

然后对Payment#getCreditCardNumber将返回而不是数字。***spring-doc.cadn.net.cn

您可以在最新的 Spring Security Data 示例中看到所有这些功能协同工作。spring-doc.cadn.net.cn

密码检查泄露 - #7395

如果您要让用户选择密码,那么确保此类密码尚未泄露至关重要。 Spring Security 6.3 使这变得如此简单,就像发布CompromisedPasswordChecker:spring-doc.cadn.net.cn

@Bean
public CompromisedPasswordChecker compromisedPasswordChecker() {
    return new HaveIBeenPwnedRestApiPasswordChecker();
}
@Bean
fun compromisedPasswordChecker(): CompromisedPasswordChecker = HaveIBeenPwnedRestApiPasswordChecker()

spring-security-rsa现在是 Spring Security 的一部分 - #14202

自 2017 年以来,Spring Security 一直在进行一项长期计划,将各种 Spring Security 扩展折叠到 Spring Security 中。 在 6.3 中,spring-security-rsa成为这些项目中的最新项目,这将帮助团队长期维护和添加功能。spring-doc.cadn.net.cn

OAuth 2.0 令牌交换授权 - #5199

Spring Security 中票数最高的 OAuth 2.0 功能之一现已在 6.3 中推出,即对 OAuth 2.0 Token Exchange 授权的支持。spring-doc.cadn.net.cn

对于任何配置为令牌交换的客户端,您可以在 Spring Security 中通过添加TokenExchangeAuthorizedClientProvider实例复制到OAuth2AuthorizedClientManager这样:spring-doc.cadn.net.cn

@Bean
public OAuth2AuthorizedClientProvider tokenExchange() {
	return new TokenExchangeOAuth2AuthorizedClientProvider();
}
@Bean
fun tokenExchange(): OAuth2AuthorizedClientProvider = TokenExchangeOAuth2AuthorizedClientProvider()

然后使用@RegisteredOAuth2AuthorizedClient注解像往常一样,以资源服务器所需的扩展权限检索适当的令牌。spring-doc.cadn.net.cn

其他亮点

有关详尽列表,请参阅 6.3.0-RC16.3.0-M36.3.0-M26.3.0-M1 的发行说明。spring-doc.cadn.net.cn