Spring Security 4 sessionRegistry 不填充主体列表
Posted
技术标签:
【中文标题】Spring Security 4 sessionRegistry 不填充主体列表【英文标题】:Spring Security 4 sessionRegistry doesn't populate Principal list 【发布时间】:2015-09-12 00:55:11 【问题描述】:我正在尝试实现一个管理员用户可以终止另一个用户会话的功能。我在这里遵循了官方 Spring Security 文档:http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#list-authenticated-principals,并开始通过sessionRegistry.getAllPrincipals()
获取所有当前登录的用户,但它总是返回一个空列表。
我在 SessionRegistryImpl.registerNewSession() 中设置了一个断点,可以看到它确实被调用了,并且它确实将 UserDetails
(我自己的实现了 equals() 和 hashCode() 的实现)添加到了 hashmap principals
.但是当我从 Spring MVC 控制器访问 sessionRegistry bean 时,列表总是空的。
我的配置看起来和documentation 差不多。
如何解决这个问题?有没有人成功让 SessionRegistry 与 Spring Security 4 一起工作?我记得我按照这些说明使它与 Spring Security 3 一起工作(enter link description here)
【问题讨论】:
我之前遇到过完全相同的问题,在优化项目配置期间,该问题已自动为我修复。但是,我的整个配置是针对 Spring-MVC 而不仅仅是 Spring,并且是 XML。 让我猜猜,您正在加载相同的配置(类)两次。有效地导致所有 bean 的 2 个实例,包括SessionRegistry
。您的控制器使用不同的实例作为 Spring Security,因此它永远不会收到任何东西。修复您的配置,确保您没有两次扫描组件/配置类。
谢谢大家,这对我来说很有意义。明天我会首先调查配置,这是以前由另一个人完成的。
@M.Deinum 如何检查 bean 是否加载了两次?我对空的委托人列表也有同样的问题。
我的 spring 上下文已显式加载:<context-param> <param-name>contextConfigLocation</param-name> <param-value> WEB-INF/spring/appServlet/my-servlet-context.xml </param-value> </context-param>
【参考方案1】:
好的,所以我按照 cmets 的建议通过清理 Spring 配置文件解决了这个问题。有人搞砸了web.xml
- 他添加了对 Spring 的DispatcherServlet
已经引用的上下文 XML 的引用,导致它被加载两次。他不知道,因为 Spring 隐式引用了该文件。
附: 我吸取了教训,但是 Spring 的人可以做得更好的两件事(也许在 Spring 5?):
-
不应有隐式上下文文件加载。目前,框架将尝试从位于应用程序的 WebContent/WEB-INF 目录中名为 [servlet-name]-servlet.xml 的文件加载应用程序上下文。在这种情况下,约定优于配置会失败。
当一个bean被加载两次时应该有警告,如果有人需要覆盖一个bean定义,他必须显式声明。否则,调试此错误将导致的错误类型将花费大量时间。
【讨论】:
我想显式加载 Spring 上下文不算作双重加载<context-param> <param-name>contextConfigLocation</param-name> <param-value> WEB-INF/spring/appServlet/my-servlet-context.xml </param-value> </context-param>
以上是关于Spring Security 4 sessionRegistry 不填充主体列表的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security 入门(1-13)Spring Security - Session管理
Spring Security入门(3-8)Spring Security获取session中的UserDetail
Spring Session 和 Spring Security