此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

以下步骤与如何完成迁移会话管理支持有关。Spring中文文档

需要显式保存 SecurityContextRepository

在 Spring Security 5 中,默认行为是使用 SecurityContextPersistenceFilter 自动将 SecurityContext 保存到 SecurityContextRepository。 保存必须在提交之前和之前完成。 不幸的是,在请求完成之前(即在提交 之前)完成 的自动持久性可能会让用户感到惊讶。 跟踪状态以确定是否需要保存也很复杂,有时会导致对(即)进行不必要的写入。HttpServletResponseSecurityContextPersistenceFilterSecurityContextHttpServletResponseSecurityContextRepositoryHttpSessionSpring中文文档

在 Spring Security 6 中,默认行为是 SecurityContextHolderFilter 只会从 中读取 并将其填充到 . 用户现在必须显式保存 with 如果他们希望在请求之间持续存在。 这消除了歧义,并通过仅在必要时写入(即)来提高性能。SecurityContextSecurityContextRepositorySecurityContextHolderSecurityContextSecurityContextRepositorySecurityContextSecurityContextRepositoryHttpSessionSpring中文文档

清除上下文时(例如在注销期间)也需要保存上下文。请参阅此部分以了解更多信息Spring中文文档

如果您明确选择加入 Spring Security 6 的新默认值,则可以删除以下配置以接受 Spring Security 6 默认值。Spring中文文档

显式保存 SecurityContext
public SecurityFilterChain filterChain(HttpSecurity http) {
	http
		// ...
		.securityContext((securityContext) -> securityContext
			.requireExplicitSave(true)
		);
	return http.build();
}
@Bean
open fun springSecurity(http: HttpSecurity): SecurityFilterChain {
    http {
        securityContext {
            requireExplicitSave = true
        }
    }
    return http.build()
}
<http security-context-explicit-save="true">
	<!-- ... -->
</http>

使用配置时,重要的是,任何设置 with a 的代码都会将 保存到 if 它应该在请求之间持久化。SecurityContextHolderSecurityContextSecurityContextSecurityContextRepositorySpring中文文档

例如,以下代码:Spring中文文档

设置方式SecurityContextHolderSecurityContextPersistenceFilter
SecurityContextHolder.setContext(securityContext);
SecurityContextHolder.setContext(securityContext)

应替换为Spring中文文档

设置方式SecurityContextHolderSecurityContextHolderFilter
SecurityContextHolder.setContext(securityContext);
securityContextRepository.saveContext(securityContext, httpServletRequest, httpServletResponse);
SecurityContextHolder.setContext(securityContext)
securityContextRepository.saveContext(securityContext, httpServletRequest, httpServletResponse)

清除上下文时(例如在注销期间)也需要保存上下文。请参阅此部分以了解更多信息Spring中文文档

多个 SecurityContextRepository

在 Spring Security 5 中,默认的 SecurityContextRepository 是 。HttpSessionSecurityContextRepositorySpring中文文档

在 Spring Security 6 中,默认值为 。 如果仅为了更新到 6.0 而配置了 only,则可以将其完全删除。SecurityContextRepositoryDelegatingSecurityContextRepositorySecurityContextRepositorySpring中文文档

SecurityContextRepository 中的弃用

此弃用没有进一步的迁移步骤。Spring中文文档

优化查询RequestCache

在 Spring Security 5 中,默认行为是查询每个请求的已保存请求。 这意味着在典型的设置中,为了使用 RequestCache,对每个请求进行查询。HttpSessionSpring中文文档

在 Spring Security 6 中,默认设置是只有在定义了 HTTP 参数的情况下才会查询缓存的请求。 这使得 Spring Security 可以避免不必要地读取带有 .RequestCachecontinueHttpSessionRequestCacheSpring中文文档

在 Spring Security 5 中,默认是使用 which 将在每个请求上查询缓存的请求。 如果您没有覆盖默认值(即使用 ),则可以使用以下配置来显式选择加入 Spring Security 5.8 中的 Spring Security 6 行为:HttpSessionRequestCacheNullRequestCacheSpring中文文档

RequestCache仅检查已保存的请求(如果参数存在)continue
@Bean
DefaultSecurityFilterChain springSecurity(HttpSecurity http) throws Exception {
	HttpSessionRequestCache requestCache = new HttpSessionRequestCache();
	requestCache.setMatchingRequestParameterName("continue");
	http
		// ...
		.requestCache((cache) -> cache
			.requestCache(requestCache)
		);
	return http.build();
}
@Bean
open fun springSecurity(http: HttpSecurity): SecurityFilterChain {
    val httpRequestCache = HttpSessionRequestCache()
    httpRequestCache.setMatchingRequestParameterName("continue")
    http {
        requestCache {
            requestCache = httpRequestCache
        }
    }
    return http.build()
}
<http auto-config="true">
	<!-- ... -->
	<request-cache ref="requestCache"/>
</http>

<b:bean id="requestCache" class="org.springframework.security.web.savedrequest.HttpSessionRequestCache"
	p:matchingRequestParameterName="continue"/>