Spring Security 6.3 提供了许多新功能。 以下是该版本的亮点,或者您可以查看发行说明,了解每个功能和错误修复的详细列表。Spring中文文档

被动 JDK 序列化支持

在对 JDK 序列化安全组件的支持方面,Spring Security 历来非常激进,仅支持一个 Spring Security 次要版本的每个序列化版本。 这意味着,如果您有 JDK 序列化的安全组件,那么在升级到下一个 Spring Security 版本之前,它们将需要被疏散,因为它们将不再可反序列化。Spring中文文档

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

授权

最近几个版本的一个持续主题是重构和改进 Spring Security 的授权子系统。 从用它替换 API 开始,现在已经到了我们能够添加几个令人兴奋的新功能的地步。AccessDecisionManagerAuthorizationManagerSpring中文文档

注解参数 - #14480

6.3 的第一个功能是对注释参数的支持。 考虑一下 Spring Security 对元解的支持,如下所示:Spring中文文档

@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中文文档

@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中文文档

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

并将 SpEL 表达式应用于更多位置。Spring中文文档

安全返回值 - #14596#14597

从 Spring Security 的早期开始,您就能够使用 @PreAuthorize@PostAuthorize 对 Spring Bean 进行注释。 但是,控制器、服务和存储库并不是您唯一关心保护的东西。 例如,对于只有管理员才能调用该方法的域对象,该怎么办?OrderOrder#getPaymentSpring中文文档

现在在 6.3 中,您也可以对这些方法进行注释。 首先,像注释 Spring bean 一样注释该方法:getPaymentSpring中文文档

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 实例返回的任何内容。OrderfindOrderByIdSpring中文文档

错误处理 - #14598#14600#14601

在此版本中,您还可以使用其最后一个新方法安全注释在方法级别拦截和处理故障Spring中文文档

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 { ... }
}

并发布一个 Bean:MaskSpring中文文档

@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中文文档

您可以在最新的 Spring Security Data 示例中看到所有这些功能协同工作。Spring中文文档

密码检查泄露 - #7395

如果要让用户选择密码,请务必确保此类密码尚未泄露。 Spring Security 6.3 使这变得像发布 CompromisedPasswordChecker bean 一样简单:Spring中文文档

@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-rsaSpring中文文档

spring-security-rsa提供了许多方便的 BytesEncryptor 实现,以及用于处理 KeyStore的更简单的 APISpring中文文档

OAuth 2.0 代币交换补助金 - #5199

Spring Security 中投票最多的 OAuth 2.0 功能之一现在在 6.3 中到位,这是对 OAuth 2.0 令牌交换授权的支持。Spring中文文档

对于任何配置为令牌交换的客户端,您可以通过添加实例来激活它,如下所示:TokenExchangeAuthorizedClientProviderOAuth2AuthorizedClientManagerSpring中文文档

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

然后像往常一样使用 @RegisteredOAuth2AuthorizedClient 批注来检索具有资源服务器所需扩展权限的相应令牌。Spring中文文档

其他亮点

有关详尽列表,请参阅 6.3.0-RC16.3.0-M36.3.0-M26.3.0-M1 的发行说明。Spring中文文档