【发布时间】: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>