如何获取 Spring Security SessionRegistry?

Posted

技术标签:

【中文标题】如何获取 Spring Security SessionRegistry?【英文标题】:How do I get the Spring Security SessionRegistry? 【发布时间】:2011-04-22 14:58:33 【问题描述】:

我似乎找不到如何在 Struts 操作中获取对 Spring Security (V3) SessionRegistry 的引用。

我已经在 web.xml 文件中配置了监听器:

<listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>

我已经尝试使用@Autowired 注释将其转化为操作:

@Autowired
private SessionRegistry sessionRegistry;

@Override
public String execute() throws Exception 
    numberOfUsersLoggedin= sessionRegistry.getAllPrincipals().size();
    return SUCCESS;       


public SessionRegistry getSessionRegistry() 
    return sessionRegistry;


public void setSessionRegistry(SessionRegistry sessionRegistry) 
    this.sessionRegistry = sessionRegistry;

http 配置如下:

    <session-management invalid-session-url="/public/login.do?login_error=expired"
        session-authentication-error-url="/public/login.do" 
        session-fixation-protection="newSession">
        <concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/>
    </session-management>    

一般来说,我更愿意自己连接 Spring bean,但不确定它是如何使用命名空间公开的。每次执行操作时,会话注册表为空。

谁能指出我在这里做错了什么,或者告诉我如何举个例子?

提前感谢任何/所有回复!

【问题讨论】:

【参考方案1】:

如果您通过命名空间配置 Spring Security,concurrency-control 标签的以下属性对于访问 SystemRegistry 可能很有用:

    会话注册别名。 session-registry-ref.

官方文档中每个属性的描述:

会话注册别名。 引用内部会话也很有用 在您自己的 bean 或管理界面中使用的注册表。你可以 使用 session-registry-alias 属性公开内部 bean, 给它一个可以在配置中其他地方使用的名称。

session-registry-ref。 用户可以使用提供自己的 SessionRegistry 实现 session-registry-ref 属性。其他并发会话控制 bean 将被连接起来使用它。

【讨论】:

【参考方案2】:

不确定您是否参考过 Spring Security 参考文档中的 Session Management 部分。它有一个 sn-p 组合命名空间和自定义 bean。

【讨论】:

感谢您的链接。我将 sessionRegistry bean 添加到我的 Spring 配置中,它在 Struts 操作中不再为空。但是,当我尝试获取登录用户数(登录时)时 sessionRegistry.getAllPrincipals().size(); 的值始终为 0。我在阅读文档吗?如果我使用的是自定义登录表单(我正在使用 LDAP 进行身份验证),我似乎无法使用上面指定的命名空间/自动配置会话管理。看来我必须手动配置所有会话管理和并发控制? 查看在线文档,我似乎无法弄清楚 myAuthFilter 的身份验证提供程序的名称是什么。我正在使用不提供 bean id 的命名空间 ... 有点死神,但getAllPrincipals().size()总是为我返回零。你是如何设法让它工作的?你有自己的SessionRegistry 实现类吗?

以上是关于如何获取 Spring Security SessionRegistry?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring 获取之前捕获 Spring Security 登录表单?

spring-security saml2:如何获取当前用户?

如何使用 Spring Security 获取当前用户的角色

如何获取 Spring Security SessionRegistry?

如何在 Spring Security 中获取 userInformation?

如何从spring security获取当前登录的用户对象?