spring security - 有没有办法在我的应用程序中获取会话注册表(没有明确定制concurrentFilter)

Dau*_*aud 11 java session spring spring-security httpsession

我指的是这个帖子,在Rob Winch(Spring Security Lead)的第二篇文章中,他提到我们可以访问sessionRegisty:

<session-management>
  <concurrency-control session-registry-alias="sessionRegistry"/>
</session-management>
Run Code Online (Sandbox Code Playgroud)

因此,我注册HttpSessionEventPublisher过滤器web.xml并在我的<http>部分中指定上述设置.我添加这个:

<beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl" />
Run Code Online (Sandbox Code Playgroud)

在我的课堂上,我注入了一个sessionRegistry实例,如下所示:

@Autowired
private SessionRegistry sessionRegistry
Run Code Online (Sandbox Code Playgroud)

这就是我试图找出用户的会话的方法:

List<SessionInformation> userSessions = sessionRegistry.getAllSessions(username,false);
        for (SessionInformation userSession : userSessions){
            userSession.expireNow();
        }
Run Code Online (Sandbox Code Playgroud)

主体是用户的用户名.调试时,sessionRegistry变量principalssessionids变量为空.我在这里做错了什么,或者是krams博客提到的步骤,这是唯一的方法吗?

Xae*_*ess 0

太长了,没法评论,所以我来回答一下。

  1. 打开 Spring Security 调试(添加到log4j.propertieslog4j.logger.org.springframework.security=DEBUG)。这应该是此类问题的标准过程,因为调试会打印许多方便的信息,可以显示问题所在。

  2. 如果日志记录后调用public void registerNewSession(String sessionId, Object principal)里面的方法,您可以调试吗?SessionRegistryImpl如果不是,则表示HttpSessionEventPublisher设置不正确。

  3. @Autowired private SessionRegistry sessionRegistry;你在课堂上使用,不是吗?

  4. 编辑:您可以检查注册表中是否有任何主体吗?

    List<Object> userSessions = sessionRegistry.getAllPrincipals();
    
    Run Code Online (Sandbox Code Playgroud)

    其中Objects 是您使用的主体实例。

  • 这被标记为答案,但是答案是什么?我想看看是否可以在不启用并发控制的情况下使用 SessionRegistry。 (7认同)