如何访问 Spring Security 中已注销的用户名?

Posted

技术标签:

【中文标题】如何访问 Spring Security 中已注销的用户名?【英文标题】:How is possible to access to the logged out user name in Spring Security? 【发布时间】:2017-05-20 02:02:21 【问题描述】:

我们使用 Spring Security 4.0.x,我需要找到访问已注销用户名的方法。 我已经配置了LogoutSuccessHandler:

<logout logout-url="/logout" success-handler-ref="logoutSuccessHandler" />

我在方法签名中看到了authentication 对象:

onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)

不幸的是,authentication 对象是空的。 我看到LogoutHandler (SecurityContextLogoutHandler) 在logoutSuccessHandler 之前清除了身份验证,但我找不到通过&lt;logout .. 配置配置LogoutHandler 的方法。

如何在 Spring Security 中访问已注销的用户名?

【问题讨论】:

【参考方案1】:
if (requiresLogout(request, response)) 
            Authentication auth = SecurityContextHolder.getContext().getAuthentication();

            if (logger.isDebugEnabled()) 
                logger.debug("Logging out user '" + auth
                        + "' and transferring to logout destination");
            

            this.handler.logout(request, response, auth);

            logoutSuccessHandler.onLogoutSuccess(request, response, auth);

            return;
        

如你所见,过滤器得到了Authentication,所以即使SecurityContextLogoutHandler 清除了SecurityContextHolder 中的Authenticationauth 仍然保留Authentication,你还有其他代码吗在LogoutFilter 之前清楚Authentication 吗?

【讨论】:

我已经调试了LogoutFilter,但我看到认证已经是null。调用SecurityContextHolder#clearContext 的唯一代码是SecurityContextPersistenceFilterFilterChainProxy。怎么了? 你有没有找到任何关于SecurityContextHolder.getContext().setAuthentication(null or null object)的代码? 我找到了在 spring security 之前清理会话的代码。感谢您的帮助!

以上是关于如何访问 Spring Security 中已注销的用户名?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security:注销时出现 404

如何使用xml在spring security中禁用注销确认?

您如何在 spring-security 中注销所有已登录的用户?

如何在 Spring Security 中编辑定时注销

Spring-security-cas 插件单点注销不起作用

使用 Spring Security 更新角色时如何注销用户