[英]Logout doesn't work with Spring Boot, Spring Security and Thymleaf
我正在尝试为我们的 Spring 引导应用程序添加注销 function 但 Spring 注销不起作用...经过身份验证的用户仍然存在并且它没有清除安全上下文。 真正让我吃惊的是,它有时有效,有时无效。 我不知道为什么!
Thymeleaf:
<li><a class="dropdown-item" href="javascript: document.logoutForm.submit()" role="menuitem"><i class="fas fa-sign-out-alt"></i> Logout</a></li>
<form name="logoutForm" th:action="@{/logout}" method="post" th:hidden="true">
<input hidden type="submit" value="Sign Out"/>
</form>
这是我的注销代码块;
.logout()
.clearAuthentication(true)
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/oauth2/authorization/login")
.addLogoutHandler(new HeaderWriterLogoutHandler(
new ClearSiteDataHeaderWriter(
ClearSiteDataHeaderWriter.Directive.CACHE,
ClearSiteDataHeaderWriter.Directive.COOKIES,
ClearSiteDataHeaderWriter.Directive.STORAGE)));
我也尝试过,但没有帮助;
.deleteCookies("JSESSIONID")
.invalidateHttpSession(true)
有谁知道为什么它有这种奇怪的行为?
让我假设问题是 oauth2 登录/注销配置的配置不完整:
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/").permitAll()
.anyRequest().authenticated()
.and()
.logout()
.logoutSuccessHandler(logoutSuccessHandler())
.invalidateHttpSession(true)
.clearAuthentication(true)
.deleteCookies("JSESSIONID")
.and()
.oauth2Login();
}
private LogoutSuccessHandler logoutSuccessHandler() {
...
}
}
注意两个时刻:
.oauth2Login()
- 使用 OAuth 2.0 配置身份验证支持.logoutSuccessHandler(...)
- 为结束 session 的用户重定向到正确的 oauth2 服务器注销端点。 不幸的是,我不知道您的 oauth2 提供商,无论如何我建议查看OidcClientInitiatedLogoutSuccessHandler
以了解如何重定向到注销 url。 如果您不使用openid
oauth2 提供程序,您可以基于SimpleUrlLogoutSuccessHandler
实现自己的注销处理程序,您应该只知道注销 url 和 url 参数,用于在 oauth2 服务器上成功注销后重定向。我有类似的问题。 现在已经解决了。 我使用了以下代码:
.and().logout().logoutSuccessUrl("/logoutSuccess").deleteCookies("JSESSIONID").invalidateHttpSession(true);
试试这个。 它正在我的机器上工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.