对于最新的稳定版本,请使用 Spring Security 6.5.3! |
Spring Security 6.4 中的新增功能
Spring Security 6.4 提供了许多新功能。 以下是该版本的亮点,或者您可以查看发行说明以获取每个功能和错误修复的详细列表。
弃用通知
随着我们越来越接近 Spring Security 7,及时了解弃用非常重要。 因此,本节指出了 6.4 版本中的弃用。
-
方法安全性 -
AuthorizationManager#check
被弃用,取而代之的是AuthorizationManager#authorize
. 这主要是为了允许返回类型是接口而不是具体类。 如果调用AuthorizationManager#check
,请调用AuthorizationManager#authorize
相反。相关,
AuthorizationEventPublisher#publishEvent
这需要一个AuthorizationDecision
被弃用,取而代之的是采用AuthorizationResult
界面。 -
方法安全性 -
PrePostTemplateDefaults
被弃用,取而代之的是更通用的AnnotationTemplateExpressionDefaults
因为现在有元注释属性支持@AuthenticationPrincipal
和@CurrentSecurityContext
也。 如果您正在构建PrePostTemplateDefaults
,则将其更改为AnnotationTemplateExpressionDefaults
. -
OAuth 2.0 -
NimbusOpaqueTokenIntrospector
已被弃用,取而代之的是SpringOpaqueTokenIntrospector
为了消除 Spring Security OAuth 2.0 资源服务器对oidc-oauth2-sdk
包。 如果您正在构建NimbusOpaqueTokenIntrospector
,将其替换为SpringOpaqueTokenIntrospector
的构造函数 -
OAuth 2.0 -
DefaultAuthorizationCodeTokenResponseClient
,DefaultClientCredentialsTokenResponseClient
,DefaultJwtBearerTokenResponseClient
,DefaultPasswordTokenResponseClient
,DefaultRefreshTokenTokenResponseClient
和DefaultTokenExchangeTokenResponseClient
被弃用,取而代之的是RestClient
等价物。相关,
JwtBearerGrantRequestEntityConverter
,OAuth2AuthorizationCodeGrantRequestEntityConverter
,OAuth2ClientCredentialsGrantRequestEntityConverter
,OAuth2PasswordGrantRequestEntityConverter
,OAuth2RefreshTokenGrantRequestEntityConverter
被弃用,转而提供DefaultOAuth2TokenRequestParametersConverter
到上述Tokens响应客户端之一例如,如果您有以下安排:
private static class MyCustomConverter extends AbstractOAuth2AuthorizationGrantRequestEntityConverter<OAuth2AuthorizationCodeGrantRequest> { @Override protected MultiValueMap<String, String> createParameters (OAuth2AuthorizationCodeGrantRequest request) { MultiValueMap<String, String> parameters = super.createParameters(request); parameters.add("custom", "value"); return parameters; } } @Bean OAuth2AccessTokenResponseClient authorizationCode() { DefaultAuthorizationCodeTokenResponseClient client = new DefaultAuthorizationCodeTokenResponseClient(); Converter<AuthorizationCodeGrantRequest, RequestEntity<?>> entityConverter = new OAuth2AuthorizationCodeGrantRequestEntityConverter(); entityConverter.setParametersConverter(new MyCustomConverter()); client.setRequestEntityConverter(entityConverter); return client; }
此配置已弃用,因为它使用
DefaultAuthorizationCodeTokenResponseClient
和OAuth2AuthorizationCodeGrantRequestEntityConverter
. 现在推荐的配置是:private static class MyCustomConverter implements Converter<OAuth2AuthorizationCodeGrantRequest, Map<String, String>> { @Override public MultiValueMap<String, String> convert(OAuth2AuthorizeCodeGrantRequest request) { MultiValueMap<String, String> parameters = OAuth2AuthorizationCodeGrantRequest.defaultParameters(request); parameters.add("custom", "value"); return parameters; } } @Bean OAuth2AccessTokenResponseClient authorizationCode() { RestClientAuthorizationCodeTokenResponseClient client = new RestClientAuthorizationCodeTokenResponseClient(); client.setParametersConverter(new MyCustomConverter()); return client; }
-
SAML 2.0 - Spring Security SAML 2.0 Service Provider 接口的未版本化 OpenSAML 实现已被弃用,取而代之的是版本化接口。 例如
OpenSamlAuthenticationTokenConverter
现在被替换为OpenSaml4AuthenticationTokenConverter
和OpenSaml5AuthenticationTokenConverter
. 如果您要构建这些已弃用的版本之一,请将其替换为您正在使用的 OpenSAML 版本对应的版本。 -
SAML 2.0 - 围绕的方法
AssertingPartyDetails
被弃用,取而代之的是使用AssertingPartyMetadata
接口。 -
LDAP - 用法
DistinguishedName
现在已弃用,以便与 Spring LDAP 的弃用保持一致
通行密钥
Spring Security 现在支持密钥。
方法安全性
-
所有方法安全注释现在都支持框架的
@AliasFor
-
@AuthenticationPrincipal
和@CurrentSecurityContext
现在支持注释模板。这意味着您现在可以像这样使用 Spring 的元注释支持:
-
Java
-
Kotlin
@Target(TargetType.TYPE) @Retention(RetentionPolicy.RUNTIME) @AuthenticationPrincipal("claims['{claim}']") @interface CurrentUsername { String claim() default "sub"; } // ... @GetMapping public String method(@CurrentUsername("username") String username) { // ... }
annotation CurrentUsername(val claim: String = "sub") // ... @GetMapping fun method(@CurrentUsername("username") val username: String): String { // ... }
-
-
进行了多项改进,使 Security 的注释搜索与
AbstractFallbackMethodSecurityMetadataSource
的算法。 这有助于从早期版本的 Spring Security 迁移。 -
本机应用程序现在可以用
@AuthorizeReturnObject
-
本机应用程序现在可以引用 bean 中的
@PreAuthorize
和@PostAuthorize
-
SecurityAnnotationScanners
提供了一个方便的 API,用于扫描安全注释以及将安全选择和模板功能添加到自定义注释
OAuth 2.0
-
oauth2Login()
现在接受OAuth2AuthorizationRequestResolver
作为@Bean
-
ClientRegistrations
现在支持外部获取的配置 -
添加
loginPage()
响应式 DSLoauth2Login()
-
OIDC 后通道支持现在接受类型为
logout+jwt
-
添加
RestClient
基于OAuth2AccessTokenResponseClient
以更一致地配置访问Tokens请求。选择使用
RestClient
支持,只需为每种授权类型发布一个 Bean,如以下示例所示:-
Java
-
Kotlin
@Configuration public class SecurityConfig { @Bean public OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> authorizationCodeAccessTokenResponseClient() { return new RestClientAuthorizationCodeTokenResponseClient(); } @Bean public OAuth2AccessTokenResponseClient<OAuth2RefreshTokenGrantRequest> refreshTokenAccessTokenResponseClient() { return new RestClientRefreshTokenTokenResponseClient(); } @Bean public OAuth2AccessTokenResponseClient<OAuth2ClientCredentialsGrantRequest> clientCredentialsAccessTokenResponseClient() { return new RestClientClientCredentialsTokenResponseClient(); } @Bean public OAuth2AccessTokenResponseClient<JwtBearerGrantRequest> jwtBearerAccessTokenResponseClient() { return new RestClientJwtBearerTokenResponseClient(); } @Bean public OAuth2AccessTokenResponseClient<TokenExchangeGrantRequest> tokenExchangeAccessTokenResponseClient() { return new RestClientTokenExchangeTokenResponseClient(); } }
@Configuration class SecurityConfig { @Bean fun authorizationCodeAccessTokenResponseClient(): OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> { return RestClientAuthorizationCodeTokenResponseClient() } @Bean fun refreshTokenAccessTokenResponseClient(): OAuth2AccessTokenResponseClient<OAuth2RefreshTokenGrantRequest> { return RestClientRefreshTokenTokenResponseClient() } @Bean fun clientCredentialsAccessTokenResponseClient(): OAuth2AccessTokenResponseClient<OAuth2ClientCredentialsGrantRequest> { return RestClientClientCredentialsTokenResponseClient() } @Bean fun jwtBearerAccessTokenResponseClient(): OAuth2AccessTokenResponseClient<JwtBearerGrantRequest> { return RestClientJwtBearerTokenResponseClient() } @Bean fun tokenExchangeAccessTokenResponseClient(): OAuth2AccessTokenResponseClient<TokenExchangeGrantRequest> { return RestClientTokenExchangeTokenResponseClient() } }
-
-
Tokens交换现在支持刷新Tokens
SAML 2.0
-
添加了 OpenSAML 5 支持。 现在您可以使用 OpenSAML 4 或 OpenSAML 5;默认情况下,Spring Security 将根据类路径上的内容选择正确的实现。
-
将 EntityID 用于
registrationId
被简化。一种常见的模式是通过其
entityID
. 在以前的版本中,这需要直接配置OpenSamlAuthenticationRequestResolver
. 现在,请求解析器默认查找registrationId
作为请求参数,此外还可以在路径中查找它。 这允许您使用RelyingPartyRegistrations
或OpenSaml4/5AssertingPartyMetadataRepository
无需修改registrationId
值或自定义请求解析器。与此相关的是,您现在可以配置
authenticationRequestUri
以包含查询参数 -
断言方现在可以根据元数据的到期时间在后台刷新。
例如,您现在可以使用
OpenSaml5AssertingPartyMetadataRepository
去做:-
Java
-
Kotlin
@Component public class RefreshableRelyingPartyRegistrationRepository implements IterableRelyingPartyRegistrationRepository { private final AssertingPartyMetadataRepository assertingParties = OpenSaml5AssertingPartyMetadataRepository .fromTrustedMetadataLocation("https://idp.example.org").build(); @Override public RelyingPartyRegistration findByRegistrationId(String registrationId) { AssertingPartyMetadata assertingParty = this.assertingParties.findByEntityId(registrationId); return RelyingPartyRegistration.withAssertingPartyMetadata(assertingParty) // relying party configurations .build(); } // ... }
@Component open class RefreshableRelyingPartyRegistrationRepository: IterableRelyingPartyRegistrationRepository { private val assertingParties: AssertingPartyMetadataRepository = OpenSaml5AssertingPartyMetadataRepository .fromTrustedMetadataLocation("https://idp.example.org").build() override fun findByRegistrationId(String registrationId): RelyingPartyRegistration { val assertingParty = this.assertingParties.findByEntityId(registrationId) return RelyingPartyRegistration.withAssertingPartyMetadata(assertingParty) // relying party configurations .build() } // ... }
此实现还支持验证元数据的签名。
-
-
您现在可以对信赖方元数据进行签名
-
RelyingPartyRegistrationRepository
现在可以缓存结果。 如果要将注册值的加载推迟到应用程序启动后,这将很有帮助。 如果您想控制何时通过 Spring Cache 刷新元数据,它也很有帮助。 -
为了与 SAML 2.0 标准保持一致,元数据终结点现在使用
application/samlmetadata+xml
MIME 类型
Web
-
CSRF BREACH Tokens现在更加一致
-
记住我 cookie 现在更具可定制性
-
安全过滤器链会发现更多无效配置。 例如,在任意请求过滤器链之后声明的过滤器链是无效的,因为它永远不会被调用:
-
Java
-
Kotlin
@Bean @Order(0) SecurityFilterChain api(HttpSecurity http) throws Exception { http // implicit securityMatcher("/**") .authorizeHttpRequests(...) .httpBasic(...) return http.build(); } @Bean @Order(1) SecurityFilterChain app(HttpSecurity http) throws Exception { http .securityMatcher("/app/**") .authorizeHttpRequests(...) .formLogin(...) return http.build(); }
@Bean @Order(0) fun api(val http: HttpSecurity): SecurityFilterChain { http { authorizeHttpRequests { // ... } } return http.build() } @Bean @Order(1) fun app(val http: HttpSecurity): SecurityFilterChain { http { securityMatcher("/app/**") authorizeHttpRequests { // ... } } return http.build() }
您可以在相关工单中阅读更多内容。
-
-
ServerHttpSecurity
现在捡起ServerWebExchangeFirewall
作为@Bean
可观察性
可观测性现在支持分别切换授权、身份验证和请求观察例如,要关闭过滤器链观察,您可以发布@Bean
像这个:
-
Java
-
Kotlin
@Bean
SecurityObservationSettings allSpringSecurityObservations() {
return SecurityObservationSettings.withDefaults()
.shouldObserveFilterChains(false).build();
}
@Bean
fun allSpringSecurityObservations(): SecurityObservationSettings {
return SecurityObservationSettings.builder()
.shouldObserveFilterChains(false).build()
}
Kotlin
-
Kotlin DSL 现在支持 SAML 2.0 和
GrantedAuthorityDefaults
和RoleHierarchy
@Bean
s -
@PreFilter
和@PostFilter
现在在 Kotlin 中受支持 -
Kotlin Reactive DSL 现在支持
SecurityContextRepository
前交叉韧带
-
AclAuthorizationStrategyImpl
现在支持RoleHierarchy