此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Security 6.4.1spring-doc.cn

Spring Security 6.3 中的新增功能

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

被动 JDK 序列化支持

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

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

授权

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

批注参数 - #14480

6.3 的第一个功能是支持 Comments 参数。 考虑一下 Spring Security 对元注释的支持,如下所示:spring-doc.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.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.cn

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

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

安全返回值 - #14596#14597

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

现在在 6.3 中,您也可以对这些方法进行注释。 首先,像 Spring bean 一样对方法进行 Comments:getPaymentspring-doc.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实例来保护从中返回的任何内容。OrderfindOrderByIdspring-doc.cn

错误处理 - #14598#14600#14601

在此版本中,您还可以使用其最后一个新方法安全注释在方法级别拦截和处理失败spring-doc.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 { ... }
}

并发布一个 bean:Maskspring-doc.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.cn

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

密码检查泄露 - #7395

如果您要让用户选择密码,那么确保此类密码尚未泄露至关重要。 Spring Security 6.3 使这就像发布 CompromisedPasswordChecker bean 一样简单:spring-doc.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-rsaspring-doc.cn

spring-security-rsa提供了许多方便的 BytesEncryptor 实现以及用于使用 KeyStore的更简单的 APIspring-doc.cn

OAuth 2.0 令牌交换授权 - #5199

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

对于任何配置为令牌交换的客户端,你可以通过在 Spring Security 中添加一个实例来激活它,如下所示:TokenExchangeAuthorizedClientProviderOAuth2AuthorizedClientManagerspring-doc.cn

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

然后像往常一样使用 @RegisteredOAuth2AuthorizedClient 注释来检索具有 Resource Server 所需的扩展权限的相应令牌。spring-doc.cn

其他亮点

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