Spring security Spring安全性升级到3.1.0.RELEASE-找不到setContextClass来定义应使用哪个实例创建新的SecurityContext

Spring security Spring安全性升级到3.1.0.RELEASE-找不到setContextClass来定义应使用哪个实例创建新的SecurityContext,spring-security,Spring Security,HttpSessionContextIntegrationFilter的文档说明如下 如果由于任何原因无法从HttpSession获取有效的SecurityContext,则将创建并使用新的SecurityContext。创建的对象将是setContextClass(Class)方法定义的实例(默认为SecurityContextImpl) 但它说“已弃用。请改用SecurityContextPersistenceFilter。” 我已经切换到SecurityContextPersistence

HttpSessionContextIntegrationFilter的文档说明如下

如果由于任何原因无法从HttpSession获取有效的SecurityContext,则将创建并使用新的SecurityContext。创建的对象将是setContextClass(Class)方法定义的实例(默认为SecurityContextImpl)

但它说“已弃用。请改用SecurityContextPersistenceFilter。”

我已经切换到SecurityContextPersistenceFilter,但现在我不知道如何将实例设置为我们自己的SecurityContext实现


我花了一整天的时间搜索,但没有运气。我希望这不是一个答案在我面前出现的情况!:/非常感谢任何帮助。

在春季3.2.4,
SecurityContextPersistenceFilter
获得的
SecurityContext
如下:

SecurityContext contextBeforeChainExecution = repo.loadContext(holder);
protected SecurityContext generateNewContext() {
    return SecurityContextHolder.createEmptyContext();
}
默认的
repo
HttpSessionSecurityContextRepository
,它实例化了
SecurityContext
,如下所示:

SecurityContext contextBeforeChainExecution = repo.loadContext(holder);
protected SecurityContext generateNewContext() {
    return SecurityContextHolder.createEmptyContext();
}
因此,如果您希望自己的策略生成新的
SecurityContext
,可以执行以下操作:

  • 扩展
    HttpSessionSecurityContextRepository
    (假设您将其命名为
    MySecurityContextRepository
  • 重写其
    generateNewContext()
    方法
  • 通过构造函数参数将
    MySecurityContextRepository
    注入
    SecurityContextPersistenceFilter
    实例(因为
    setSecurityContextRepository()
    setter已被弃用)