文末有本篇文章的项目源码文件可供下载学习
我们知道JwtAuthenticateFilter会将用户信息封装到Authentication对象中,因为请求logout时我们需要携带相应的token,所以我们可以通过认证流程,到达Controller层,进行相关业务的调用.
对于退出登录的业务,因为我们没有使用redis缓存,我们可以在数据库中给用户对象设置一个状态位current_flag,当我们退出的时候存储为logout,当我们登录的时候存储为login,这样就可以起到该用户是否已经登录或者退出了.
0.配置思路
- 在本案例的基础上,添加相应代码与配置.
- 在SecurityController.java中新增loggou方法.
- 在SecurityServiceImpl.java中新增logout方法.
- 完成相关测试
1.编辑SecurityController.java
@GetMapping("logout")public CustomerResult logout() {return securityService.logout();}
2.编辑SecurityServiceImpl.java
@Overridepublic CustomerResult logout() {
// 1.获取SecurityContextHolder中的当前用户Authentication authentication = SecurityContextHolder.getContext().getAuthentication();UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal();User user = userDetails.getUser();
// 2.设置当前用户的状态user.setCurrentFlag("logout");userMapper.updateCurrentFlagById(user);return new CustomerResult().code("200").msg("注销成功");}
3.相关测试
3.1未登录访问customer/firstMethod
我们发现是拒绝访问的.
3.2登录之后访问customer/firstMethod
登录成功,复制token,访问customer/firstMethod
成功访问.
3.3退出登录之后访问customer/firstMethod
访问logout
再次访问customer/firstMethod
至此,我们配置的退出登录是成功的.
本篇文章的项目源码文件,可供点击下载学习