1

我想从已登录用户的 Hashmap 中删除已注销的用户,但是当我按下注销链接时,我找不到执行此操作的方法。它只是重定向到登录页面。

在春季安全我有

 <logout invalidate-session="true" 
        logout-success-url="/" 
        logout-url="/logout.htm"/>

注销链接就像

 <a href="logout.htm">Logout</a>

当我按下此链接时,它只是转到我的登录映射

 @RequestMapping("login")
public ModelAndView login(){}

当我尝试使用获取用户详细信息时

  SecurityContextHolder.getContext()
            .getAuthentication().getPrincipal();

它返回我匿名用户。那么如何获取已注销的用户详细信息。

如果您需要更多详细信息,请告诉我。

4

4 回答 4

3

org.springframework.security.web.authentication.logout.LogoutSuccessHandler接口的实现作为 bean 添加到您的安全上下文中。

然后你可以使用它:

<logout success-handler-ref="yourLogoutSuccessHandler" />

编辑。 正如 Marcel 所提到的,这个解决方案不能开箱即用,因为你不能混合success-handler-reflogout-success-url属性(参考)。我更喜欢稍微不同的解决方案:您可以使用组合而不是继承:

  1. 为SimpleUrlLogoutSuccessHandler bean准备配置。
  2. 通过相应的defaultTargetUrl属性设置logout-success-url 。
  3. 使用LogoutSuccessHandler接口将SimpleUrlLogoutSuccessHandler bean 注入到您的CustomUrlLogoutSuccessHandler,并在完成您的工作后调用它。

优点是您将更少地与框架代码耦合。所以在从 Spring Security 3.1 迁移到 Spring Security YY 的情况下你会遇到更少的问题

于 2012-12-18T16:45:29.870 回答
2

关于的提示LogoutSuccessHandler是正确的。但是,如果我没记错的话,您必须考虑配置success-handler-reflogout-success-url互斥。因此,您需要在成功处理程序中手动实现对 URL 的转发。指针:https ://stackoverflow.com/a/6770785/131929

于 2012-12-18T20:34:18.590 回答
0
Authentication authentication = SecurityContextHolder.getContext().getAuthentication()
authentication.getName()
于 2012-12-19T11:21:07.553 回答
0

在您的 applicationContext-security.xml 文件中添加成功处理程序,如下所示

< logout logout-url="/resources/j_spring_security_logout" success-handler-ref="com.mycompany.security.SpringSecurityLogoutHandler" />

创建将实现org.springframework.security.web.authentication.logout.LogoutHandler接口的类,并在它的注销方法中执行注销时所需的所有操作。

于 2013-01-04T07:04:50.907 回答