Spring Security 6.4 中的新增功能

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

弃用通知

随着我们越来越接近 Spring Security 7,及时了解弃用信息非常重要。 因此,本节指出了 6.4 版本中的弃用。spring-doc.cadn.net.cn

  • 方法安全性 - AuthorizationManager#check已弃用,取而代之的是AuthorizationManager#authorize. 这主要是为了允许返回类型成为接口而不是具体类。 如果您正在调用AuthorizationManager#check,请调用AuthorizationManager#authorize相反。spring-doc.cadn.net.cn

    与此相关的是,AuthorizationEventPublisher#publishEvent这需要AuthorizationDecision已弃用,取而代之的是采用AuthorizationResult接口。spring-doc.cadn.net.cn

  • 方法安全性 - PrePostTemplateDefaults已弃用,取而代之的是更通用的AnnotationTemplateExpressionDefaults因为现在有对@AuthenticationPrincipal@CurrentSecurityContext也。 如果您正在构造PrePostTemplateDefaults,请将其更改为AnnotationTemplateExpressionDefaults.spring-doc.cadn.net.cn

  • OAuth 2.0 版本 - NimbusOpaqueTokenIntrospector已被弃用,取而代之的是SpringOpaqueTokenIntrospector为了消除 Spring Security OAuth 2.0 Resource Server 对oidc-oauth2-sdk包。 如果您正在构造NimbusOpaqueTokenIntrospector,将其替换为SpringOpaqueTokenIntrospector的构造函数spring-doc.cadn.net.cn

  • OAuth 2.0 版本 - DefaultAuthorizationCodeTokenResponseClient,DefaultClientCredentialsTokenResponseClient,DefaultJwtBearerTokenResponseClient,DefaultPasswordTokenResponseClient,DefaultRefreshTokenTokenResponseClientDefaultTokenExchangeTokenResponseClient被弃用,取而代之的是它们的RestClient等价物。spring-doc.cadn.net.cn

    与此相关的是,JwtBearerGrantRequestEntityConverter,OAuth2AuthorizationCodeGrantRequestEntityConverter,OAuth2ClientCredentialsGrantRequestEntityConverter,OAuth2PasswordGrantRequestEntityConverter,OAuth2RefreshTokenGrantRequestEntityConverter已弃用,取而代之的是提供DefaultOAuth2TokenRequestParametersConverter添加到上述令牌响应客户端之一spring-doc.cadn.net.cn

    例如,如果您有以下安排:spring-doc.cadn.net.cn

    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;
    }

    此配置已弃用,因为它使用DefaultAuthorizationCodeTokenResponseClientOAuth2AuthorizationCodeGrantRequestEntityConverter. 现在建议的配置是:spring-doc.cadn.net.cn

    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现在替换为OpenSaml4AuthenticationTokenConverterOpenSaml5AuthenticationTokenConverter. 如果您正在构建这些已弃用的版本之一,请将其替换为与您正在使用的 OpenSAML 版本相对应的版本。spring-doc.cadn.net.cn

  • SAML 2.0 - 周围的方法AssertingPartyDetails已弃用,取而代之的是使用AssertingPartyMetadata接口。spring-doc.cadn.net.cn

  • LDAP - 的用法DistinguishedName现在已经弃用,以便与 Spring LDAP 的弃用保持一致spring-doc.cadn.net.cn

一次性令牌登录

密钥

Spring Security 现在支持 Passkeysspring-doc.cadn.net.cn

方法安全性

OAuth 2.0 版本

  • oauth2Login()现在接受OAuth2AuthorizationRequestResolver作为@Beanspring-doc.cadn.net.cn

  • ClientRegistrations现在支持外部获取的配置spring-doc.cadn.net.cn

  • 添加loginPage()到 reactive 中的 DSLoauth2Login()spring-doc.cadn.net.cn

  • OIDC 反向通道支持现在接受类型的注销令牌logout+jwtspring-doc.cadn.net.cn

  • RestClient现在可以配置OAuth2ClientHttpRequestInterceptor发出受保护资源请求spring-doc.cadn.net.cn

  • 添加RestClient-based 实现OAuth2AccessTokenResponseClient以更一致地配置访问令牌请求。spring-doc.cadn.net.cn

    要选择使用RestClient支持,只需为每个授权类型发布一个 bean,如下例所示:spring-doc.cadn.net.cn

    @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()
    	}
    
    }
  • Token Exchange 现在支持刷新令牌spring-doc.cadn.net.cn

SAML 2.0 版本

  • 添加了 OpenSAML 5 支持。 现在,您可以使用 OpenSAML 4 或 OpenSAML 5;默认情况下,Spring Security 将根据 Classpath 上的内容选择正确的实现。spring-doc.cadn.net.cn

  • 将 EntityID 用于registrationId被简化。spring-doc.cadn.net.cn

    一种常见的模式是通过他们的entityID. 在以前的版本中,这需要直接配置OpenSamlAuthenticationRequestResolver. 现在,请求解析程序默认查找registrationId 作为请求参数,此外还可以在 PATH 中查找它。 这允许您使用RelyingPartyRegistrationsOpenSaml4/5AssertingPartyMetadataRepository而无需修改registrationId值或自定义请求解析程序。spring-doc.cadn.net.cn

    与此相关,您现在可以配置authenticationRequestUri包含 Query 参数spring-doc.cadn.net.cn

  • 现在,可以根据元数据的到期时间在后台刷新断言方。spring-doc.cadn.net.cn

    @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()
    	}
    
    	// ...
    }

    此实现还支持元数据签名的验证。spring-doc.cadn.net.cn

  • 您现在可以对信赖方元数据进行签名spring-doc.cadn.net.cn

  • RelyingPartyRegistrationRepository现在可以缓存结果。 如果要将注册值的加载推迟到应用程序启动后,这将非常有用。 如果您想控制何时通过 Spring Cache 刷新元数据,这也很有用。spring-doc.cadn.net.cn

  • 为了与 SAML 2.0 标准保持一致,元数据端点现在使用application/samlmetadata+xmlMIME 类型spring-doc.cadn.net.cn

Web

可观察性

可观测性现在支持分别切换授权、身份验证和请求观察例如,要关闭筛选链观察,您可以发布@Bean像这个:spring-doc.cadn.net.cn

@Bean
SecurityObservationSettings allSpringSecurityObservations() {
	return SecurityObservationSettings.withDefaults()
            .shouldObserveFilterChains(false).build();
}
@Bean
fun allSpringSecurityObservations(): SecurityObservationSettings {
    return SecurityObservationSettings.builder()
            .shouldObserveFilterChains(false).build()
}

Kotlin

阿克尔