欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

史上最简单的Spring Security教程(六):用户登出

程序员文章站 2022-06-02 17:43:47
...

 

既然有用户登录,势必就会有用户登出,Spring Security 也提供了比较详细的登出配置。

其实,之前的程序中,依然支持用户登出,不知道有人点过 退出登录 按钮没有,结果是404。其实,原因也很简单,我们的 退出登录 按钮使用超链接实现的,而超链接是 GET 方式请求的,在 Spring Security 用户登出配置中,CSRF 默认是开启的,并没有关闭,不支持 GET 类型的用户登出请求。因此,就会抛出404的错误码。

......    if (http.getConfigurer(CsrfConfigurer.class) != null) {    this.logoutRequestMatcher = new AntPathRequestMatcher(this.logoutUrl, "POST");}else {    this.logoutRequestMatcher = new OrRequestMatcher(        new AntPathRequestMatcher(this.logoutUrl, "GET"),        new AntPathRequestMatcher(this.logoutUrl, "POST"),        new AntPathRequestMatcher(this.logoutUrl, "PUT"),        new AntPathRequestMatcher(this.logoutUrl, "DELETE")    );}......

既然如此,我们就把 CSRF 关闭。

http..csrf().disable()

此时,再次 退出登录,即正常登出。

史上最简单的Spring Security教程(六):用户登出

不过,此时存在一个问题,Spring Security 框架默认的用户登出成功页为 /login?logout,怎么会变成 /login 了呢?

我们打开Network标签,查看之后发现,原来是被重定向了,从 /login?logout 重定向到了 /login

史上最简单的Spring Security教程(六):用户登出

这其实不是系统出错了,而是我们配置的问题,/login?logout 这个路径被 Spring Security 给拦截了,因为需要认证成功才能访问,所以就重定向到了登录页面 /login

原则上,用户登出 成功页面,是不需要认证即可访问的,那怎么办呢?

其实也很简单,也多种方法,最简单的,放开所有的和用户登出有关的路径的权限认证即可。

http.logout().permitAll()

当然,也可以单针对登出成功路径 /login?logout 放开权限认证,而后者更适合自定义用户登出成功页面的情况。

http.authorizeRequests().antMatchers("/login?logout").permitAll()

这样,在所有配置就绪后,我们启动系统,重新登录、登出。果然,不再重定向了,而是停留在了登出成功页面。

史上最简单的Spring Security教程(六):用户登出

查看Network标签,也印证了此内容。

史上最简单的Spring Security教程(六):用户登出

其它详细源码,请参考文末源码链接,可自行下载后阅读。

 

源码

 

github

 

https://github.com/liuminglei/SpringSecurityLearning/tree/master/06

 

gitee

 

https://gitee.com/xbd521/SpringSecurityLearning/tree/master/06

 

 

 

史上最简单的Spring Security教程(六):用户登出

回复以下关键字,获取更多资源

 

SpringCloud进阶之路 | Java 基础 | 微服务 | JAVA WEB | JAVA 进阶 | JAVA 面试 | MK 精讲

史上最简单的Spring Security教程(六):用户登出

 

 

 

笔者开通了个人微信公众号【银河架构师】,分享工作、生活过程中的心得体会,填坑指南,技术感悟等内容,会比博客提前更新,欢迎订阅。

史上最简单的Spring Security教程(六):用户登出