Springboot整合SpringSecurity 04-启用登出logout功能

前面Springboot整合SpringSecurity 02-使用自定义登陆页面我们讲过了SpringSecurity的登陆功能。

本系列的按顺序写的,如果对于某些代码不清楚,请看下前面的几篇文章。
Springboot整合SpringSecurity 01-使用入门
Springboot整合SpringSecurity 02-使用自定义登陆页面
Springboot整合SpringSecurity 03-访问权限控制
Springboot整合SpringSecurity 04-启用登出logout功能
Springboot整合SpringSecurity 05-使用JDBC实现认证和授权
Springboot整合SpringSecurity 06-登陆扩展之自定义登陆验证逻辑
Springboot整合SpringSecurity 07-方法访问权限控制

本章我们继续讲解如何实现登出功能。

1.提供一个登出界面

我们在templates目录下面新建一个logout.html

<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" >
<body>
<form th:action="@{/logout}" method="post"><button type="submit" class="btn">Log Out</button>
</form>
</body>
</html>

注意: 这里我们的/logout是使用form表单post提交的。
在SpringSecurity的官方文档里面讲了:

The URL that triggers log out to occur (default is /logout).
If CSRF protection is enabled (default), then the request must also be a POST

当csrf保护是开启的状态的时候,我们的登出请求必须是POST。

2.创建一个跳转到登出页面的接口

package com.demo.spring.security.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author flw*/
@Controller
public class HelloController {@GetMapping("hello")public String hello() {return "hello";}@GetMapping("login")public String login(@RequestParam(required = false) String error,@RequestParam(required = false) String logout,Model model) {if (error != null) {model.addAttribute("error", "error");}if (logout != null) {model.addAttribute("logout", "logout");}return "login";}@GetMapping("/common/hello")@ResponseBodypublic String common() {return "common";}@GetMapping("/user/hello")@ResponseBodypublic String user() {return "user";}@GetMapping("/admin/hello")@ResponseBodypublic String admin() {return "admin";}@GetMapping("logout")public String logout() {return "logout";}
}

3.配置WebSecurityConfig

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter  {@Bean@Overridepublic UserDetailsService userDetailsService() {InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withDefaultPasswordEncoder().username("user").password("user").roles("USER").build());manager.createUser(User.withDefaultPasswordEncoder().username("admin").password("admin").roles("ADMIN").build());manager.createUser(User.withDefaultPasswordEncoder().username("dba").password("dba").roles("DBA","USER").build());return manager;}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/static/**", "/common/**", "/login/**").permitAll().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").access("hasRole('USER') and hasRole('DBA')").anyRequest().authenticated().and().formLogin().loginPage("/login").successHandler(new MyAuthenticationSuccessHandler()).permitAll().and().logout()
//                .logoutUrl("/my/logout")
//                .logoutSuccessUrl("/my/index")
//                .logoutSuccessHandler(null).invalidateHttpSession(true)
//                .addLogoutHandler(null).deleteCookies("testCookie", "testCookie2");}
}

logout(): 开启logout功能,在使用WebSecurityConfigurerAdapter的时候默认开启。
logoutUrl("/my/logout"): 指定登出页面的处理地址。默认/logout
logoutSuccessUrl("/my/index"): 指定登出成功跳转页面。默认/login?logout。这里我们使用默认配置
logoutSuccessHandler(null): 指定登出成功后的处理handler,指定了这个的话,上面的logoutSuccessUrl()就失效了。
invalidateHttpSession(true): 指定是否在登出的时候使session失效,默认为true。
addLogoutHandler(null): 指定登出的处理handler。
deleteCookies(“testCookie”, “testCookie2”): 删除指定的cookie。

同时为了测试删除cookie,我在上面登陆的配置里面添加了一个successHandler(new MyAuthenticationSuccessHandler())。指定了这个的话和登出的成功handler一样,配置的successUrl就失效了。

MyAuthenticationSuccessHandler配置如下:
/*** @author flw*/
public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {private RequestCache requestCache = new HttpSessionRequestCache();private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();public void onAuthenticationSuccess(HttpServletRequest request,HttpServletResponse response,Authentication authentication) throws IOException, ServletException {// 因为deleteCookies时候指定的path是这样的。所以这里我们的cookie也要加这个path,// 否则会删除失败String cookiePath = request.getContextPath() + "/";Cookie cookie = new Cookie("testCookie", "cookie");cookie.setMaxAge(60);cookie.setPath(cookiePath);Cookie cookie2 = new Cookie("testCookie2", "cookie2");cookie2.setMaxAge(60);cookie2.setPath(cookiePath);response.addCookie(cookie);response.addCookie(cookie2);SavedRequest savedRequest = requestCache.getRequest(request, response);// 当直接进入的登陆页面,跳转到hello.html。if (savedRequest == null) {redirectStrategy.sendRedirect(request, response, "/hello");return;}String targetUrl = savedRequest.getRedirectUrl();// 当访问其他路径被拦截到登陆页面,跳转到当时的页面。redirectStrategy.sendRedirect(request, response, targetUrl);}}

因为使用了自己的SuccessHandler,默认的跳转就失效了,所以上面我们配置了跳转逻辑。具体我们会在后面的章节讲解。

4.开启项目

现在我们可以开始测试项目了。
首先,我们访问前面配置的不需要权限的接口

http://localhost:10022/security/common/hello

结果如下:

可以看到,这时候没有我们的测试testCookie。

然后我们直接访问/login登陆页面进行登陆

http://localhost:10022/security/login

可以因为我们没有从其他页面被拦截到登陆页面,所以登陆成功后跳转到MyAuthenticationSuccessHandler指定的默认/hello页面去了。

可以看到请求里面已经携带了我们的测试cookie。

然后我们访问登出页面进行登出

http://localhost:10022/security/logout

然后访问/common/hello,结果如下:

可以看到测试的cookie已经被删掉了。

Springboot整合SpringSecurity 04-启用登出logout功能相关推荐

  1. SpringBoot整合SpringSecurity+Redis权限控制

    SpringBoot整合SpringSecurity+Redis权限控制 1.认识SpringSecurity 2.效果截图 2.1.登录接口 2.2.注册接口 2.3.管理员权限接口 2.4.普通用 ...

  2. Springboot 整合SpringSecurity实现账号密码+手机验证码登陆

    Springboot 整合SpringSecurity实现账号密码+手机验证码登陆 示例说明 版本 示例安装 Spring-security 介绍 为什么不用 shiro Spring-Securit ...

  3. SpringBoot整合SpringSecurity实现权限控制(五):用户管理

    系列文章目录 <SpringBoot整合SpringSecurity实现权限控制(一):实现原理> <SpringBoot整合SpringSecurity实现权限控制(二):权限数据 ...

  4. Springboot+JWT+Redis实现登陆登出功能

    1:什么是Token?:三部分组成:头+有效负载+签名 1.1 JWT创建中的一些方法讲解: public static String createTokenWithClaim(User user){ ...

  5. Springsecurity+cas整合后无法单点登出

    1 问题已在csdn论坛上讨论:https://bbs.csdn.net/topics/392440272 各种思路探讨: 1 将单点登录过滤器放在最前边 2 重新更换注册地址 3 将登出地址设置成无 ...

  6. springboot整合springsecurity安全框架(后端spring_security模块代码可直接使用,根据需求自定义修改)

    SpringSecurity简介 最下面有与springboot整合的模块代码 用户认证和用户授权 主要包含两部分:用户认证和用户授权 用户认证:进入用户登录时候,输入用户名密码,查询数据库查看是否正 ...

  7. 前后端分离 Spring Security 对登出.logout()的处理

    前端axios发出的post请求如下 logout() {this.axios.post(this.tools.serverAddr+'/logout').then(function () {this ...

  8. Spring Security(十):登出Logout

    一:Spring Security默认退出处理逻辑 使当前session失效 清楚与当前用户相关的remember-me记录 清空当前的SecurityContext 重定向到登录页 二:Spring ...

  9. SpringBoot整合MyBatis并实现简单的查询功能

    学了SpringBoot整合MyBatis才知道什么叫做省事,想当初用SSM的时候,那配置是真的多,SpringBoot真的是太友好了,到底有多好,接下来演示一个对数据库的查询功能,然初学者的我们大开 ...

最新文章

  1. AI 崛起的第九个年头,还有哪些大有可为的地方?
  2. 【初级】String str= ac,42,123,sd Fa,c df,4,acdf,5ewRRre ;1.把字符串按,进行分割
  3. RESTful 架构详解
  4. FineReport单行与数据库交互的方法
  5. java实现自动登录,并获取数据
  6. java中的基本数据类型和运算符_【Java基础】基本数据类型和运算符
  7. kafka spark java_spark streaming中维护kafka偏移量到外部介质
  8. 2016年1月20日总结
  9. 3月国内网民地域分布12强:广东居首 江苏重回第二
  10. 求数组子序列和最大值
  11. python: 动态网页playwright 爬虫实践
  12. 辐射定标、辐射校正、大气校正、正射校正概念
  13. linux 1394驱动下载,1394驱动
  14. 【线性代数】P7 方阵的行列式伴随矩阵
  15. cypress 安装
  16. 在做出日本收入最高的手游之前,他被人评价为“绝不可能成功”
  17. 使用css做一个简单的车轮滚滚效果
  18. 关于触摸屏的一些硬件知识
  19. echarts地图扩展中国七大区,下转到区域下的各个省
  20. ES修改默认的密码信息

热门文章

  1. Mysql数据库报错1264
  2. DB2 V9.7新特性 - 降低高水位标记
  3. 标签名选择器、id选择器、class类型选择器、组合选择器
  4. 【机器学习】Learning to Rank 简介
  5. 硅芯思见:SystemVerilog中的packedarray和unpacked array
  6. 敲击键盘后字符怎么出现在显示器
  7. java开发对学位证_您需要软件学位才能成为成功的开发人员吗
  8. 【用过的抢票软件汇总】
  9. php生成小程序二维码出现40001的情况
  10. Java中的线程状态