史上最简单的Spring Security教程(六):用户登出
既然有用户登录,势必就会有用户登出,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 框架默认的用户登出成功页为 /login?logout,怎么会变成 /login 了呢?
我们打开Network标签,查看之后发现,原来是被重定向了,从 /login?logout 重定向到了 /login。
这其实不是系统出错了,而是我们配置的问题,/login?logout 这个路径被 Spring Security 给拦截了,因为需要认证成功才能访问,所以就重定向到了登录页面 /login。
原则上,用户登出 成功页面,是不需要认证即可访问的,那怎么办呢?
其实也很简单,也多种方法,最简单的,放开所有的和用户登出有关的路径的权限认证即可。
http.logout().permitAll()
当然,也可以单针对登出成功路径 /login?logout 放开权限认证,而后者更适合自定义用户登出成功页面的情况。
http.authorizeRequests().antMatchers("/login?logout").permitAll()
这样,在所有配置就绪后,我们启动系统,重新登录、登出。果然,不再重定向了,而是停留在了登出成功页面。
查看Network标签,也印证了此内容。
其它详细源码,请参考文末源码链接,可自行下载后阅读。
源码
github
https://github.com/liuminglei/SpringSecurityLearning/tree/master/06
gitee
https://gitee.com/xbd521/SpringSecurityLearning/tree/master/06
回复以下关键字,获取更多资源
SpringCloud进阶之路 | Java 基础 | 微服务 | JAVA WEB | JAVA 进阶 | JAVA 面试 | MK 精讲
笔者开通了个人微信公众号【银河架构师】,分享工作、生活过程中的心得体会,填坑指南,技术感悟等内容,会比博客提前更新,欢迎订阅。
推荐阅读
-
史上最简单的SpringCloud教程 | 分布式配置中心(Spring Cloud Config)(Finchley版本)
-
史上最简单的Spring Security教程(十一):url区分不同的登录失败场景
-
史上最简单的 Spring 教程 | 第四篇:基于注解的IOC配置
-
史上最简单的Spring Security教程(二十):AccessDecisionVoter必须全部拥有请求所需权限才可访问
-
史上最简单的Spring Security教程(四十):SecurityContextPersistenceFilter详解
-
史上最简单的Spring Security教程(十三):动态用户
-
史上最简单的Spring Security教程(十四):动态权限(自定义UserDetailsService)
-
史上最简单的Spring Security教程(十九):AccessDecisionVoter简介及自定义访问权限投票器
-
史上最简单的Spring Security教程(十五):资源权限动态控制(FilterSecurityInterceptor)
-
史上最简单的Spring Security教程(二十七):AuthenticationManager默认实现之ProviderManager详解