0

升级到 grails 4, sessionRegistry.getAllPrincipal() 始终为空。

resources.groovy 中的原始 spring bean 是

sessionRegistry(SessionRegistryImpl)
concurrentSessionFilter(ConcurrentSessionFilter){
    sessionRegistry = sessionRegistry
    expiredUrl = '/login'
}

由于这不再有效,我尝试将 resources.groovy 更新为

sessionRegistry(SessionRegistryImpl) 
registerSessionAuthenticationStrategy(RegisterSessionAuthenticationStrategy, ref(sessionRegistry))
sessionFixationProtectionStrategy(SessionFixationProtectionStrategy)
concurrentSessionControlAuthenticationStrategy(ConcurrentSessionControlAuthenticationStrategy, ref(sessionRegistry)){
    maximumSessions=1
    exceptionIfMaximumExceeded=true
}
compositeSessionAuthenticationStrategy(CompositeSessionAuthenticationStrategy,
    [ref(registerSessionAuthenticationStrategy),ref(sessionFixationProtectionStrategy),ref(concurrentSessionControlAuthenticationStrategy)])

所有这些 bean 都来自 org.springframework.security.web.authentication.session 包。

我也为 grails.plugin.springsecurity.providerNames 添加了名称

DaoAuthenticationProvider 由自定义身份验证提供程序扩展。登录和注销工作正常,但主体永远不会在升级后的应用程序中注册。我是否需要手动注册它们(sessionRegistry.registerNewSession())?

有旧答案说使用 grails install-templates 然后编辑 src/templates/war 中的 web.xml。但是在 grails 4 中, install-templates 没有生成 war/web.xml

我尝试将它添加到 /WEB-INF/web.xml,但仍然没有运气。

4

1 回答 1

1

我认为您缺少 sessionAuthenticationStragegy bean定义,请尝试删除 compositeSessionAuthenticationStrategy 行并将其替换为:

sessionAuthenticationStrategy(CompositeSessionAuthenticationStrategy, [ref('concurrentSessionControlAuthenticationStrategy'), ref('sessionFixationProtectionStrategy'), ref('registerSessionAuthenticationStrategy')])

这是我在您的代码和我的代码之间看到的唯一区别,它与 Grails 4 一起使用。

于 2019-09-16T08:05:58.510 回答