弹簧安全注销触发器

时间:2012-12-18 16:26:16

标签: spring-mvc spring-security

我想从登录用户的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 个答案:

答案 0 :(得分:3)

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

然后你可以使用它:

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

修改 正如Marcel所提到的,这个解决方案不会开箱即用,因为你不能混合 success-handler-ref logout-success-url 属性({{3} })。我更喜欢稍微不同的解决方案:您可以使用合成:

而不是继承
  1. SimpleUrlLogoutSuccessHandler bean准备配置。
  2. 通过相应的 defaultTargetUrl 属性设置 logout-success-url
  3. 使用 LogoutSuccessHandler 界面将 SimpleUrlLogoutSuccessHandler bean注入 CustomUrlLogoutSuccessHandler ,并在完成任务后调用它。
  4. 优点是您将更少地使用框架代码。因此,在从Spring Security 3.1迁移到Spring Security Y.Y

    的情况下,您将遇到的问题更少

答案 1 :(得分:2)

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

答案 2 :(得分:0)

Authentication authentication = SecurityContextHolder.getContext().getAuthentication()
authentication.getName()

答案 3 :(得分: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接口的类,并在其注销方法中执行注销时所需的所有内容。