11

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

<session-management>
  <concurrency-control session-registry-alias="sessionRegistry"/>
</session-management>

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

<beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl" />

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

@Autowired
private SessionRegistry sessionRegistry

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

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

主体是用户的用户名。调试时,sessionRegistry变量principalssessionids变量为空。我在这里做错了什么,还是克拉姆斯博客提到的步骤是唯一的方法?

4

4 回答 4

2

那么你可以自动装配 sessionRegistry。没有错误。我用它来跟踪SessionInformation和注册会话UserPrincipal

于 2012-08-03T07:42:06.093 回答
2

仅当我将 session-registry-alias 更改为 session-registry-ref 时,它才对我有用,然后定义了默认的 impl:

<security:session-management>
    <security:concurrency-control max-sessions="10" session-registry-ref="sessionRegistry"/>
</security:session-management>

 <bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl"/>
于 2012-11-12T04:47:08.210 回答
1

好吧,这取决于您使用哪个版本的 Spring Security。

在 Spring Security 3.0中,配置如下就足够了:

<security:session-management>
    <security:concurrency-control max-sessions="1"/>
</security:session-management>

因为在内部使用了ConcurrentSessionControlStrategy类,它在sessionRegistry对象上调用registerNewSession 。

在 Spring Security 3.2中有所不同,您必须使用更详细的配置。Spring Security 参考文档中有一个示例让sessionRegistry填充数据 的最重要部分如下:

<beans:bean id="sas" class="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy">
  <beans:constructor-arg>
    <beans:list>
      <beans:bean class="org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy">
        <beans:constructor-arg ref="sessionRegistry"/>
        <beans:property name="maximumSessions" value="1" />
      </beans:bean>
      <beans:bean class="org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy">
        <beans:constructor-arg ref="sessionRegistry"/>
      </beans:bean>
    </beans:list>
  </beans:constructor-arg>
</beans:bean>

<beans:bean id="sessionRegistry"
    class="org.springframework.security.core.session.SessionRegistryImpl" />

sessionRegistry中新会话的注册在RegisterSessionAuthenticationStrategy类中执行。

希望它会帮助你。

于 2015-04-10T12:57:05.077 回答
0

太长的评论,所以我回答。

  1. 打开 Spring Security 调试(添加到log4j.propertiesline log4j.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();
    

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

于 2012-08-03T09:18:17.607 回答