目录
- 一、获取当前用户信息
- 1.1 controller
- 1.2 service
- 二、退出登录
- 2.1 controller
- 2.2 service
一、获取当前用户信息
流程分析
- 前端携带着token向后端发起请求(放在请求头中)
- 通过token进行身份认证。
身份认证失败,直接结束。
身份认证成功,接着执行第三步。 - 解析token,从token中获取用户唯一标识,通过用户的唯一标识从redis获取当前用户的信息
- redis 获取到的用户信息,返回给前端。如果获取失败,失败的原因也应该返给前端。
1.1 controller
com.yj.system.controller.SysUserController类下添加方法
/** * 获取当前用户信息 * @param token * @return */@GetMapping("/info")publicR<LoginUserVO>info(@RequestHeader(HttpConstants.AUTHENTICATION)Stringtoken){returnsysUserService.info(token);}packagecom.yj.common.core.domain.vo;importlombok.Getter;importlombok.Setter;@Getter@SetterpublicclassLoginUserVO{privateStringnickName;}1.2 service
com.yj.system.service.ISysUserService接口:
R<LoginUserVO>info(Stringtoken);oj-modules/oj-system/src/main/java/com/yj/system/service/impl/SysUserServiceImpl.java实现:
@OverridepublicR<LoginUserVO>info(Stringtoken){//添加前缀if(StrUtil.isNotEmpty(token)&&token.startsWith(HttpConstants.PREFIX)){token=token.replaceFirst(HttpConstants.PREFIX,StrUtil.EMPTY);}//在redis先行获取LoginUserloginUser=tokenService.getLoginUser(token,jwtSecret);if(null==loginUser){returnR.fail();}LoginUserVOloginUserVO=newLoginUserVO();loginUserVO.setNickName(loginUser.getNickName());returnR.success(loginUserVO);}oj-common/oj-common-security/src/main/java/com/yj/common/security/service/TokenService.java:redis线管添加获取缓存中的用户信息
publicLoginUsergetLoginUser(Stringtoken,StringjwtSecret){StringuserKey=getUserKey(token,jwtSecret);if(null==userKey)returnnull;returnredisService.getCacheObject(getTokenKey(userKey),LoginUser.class);}二、退出登录
- 用户点击退出登录,并且确认退出
- 将退出登录请求(携带token),发送至后端。(1.后端得先验证用户是处于登录状态,并且需要验证用户是管理员用户)
- 后端处理退出登录的逻辑,(将redis中的用户数据删除,让token认证失败)
- 返回结果,如果失败流程结束,继续保持登录状态,停留在当前页面。如果成功执行后续流程。前端清除存储的token,返回登录页面
2.1 controller
com.yj.system.controller.SysUserController类下添加方法
/** * 退出登录 * @param token * @return */@DeleteMapping("/logout")publicR<Void>logout(@RequestHeader(HttpConstants.AUTHENTICATION)Stringtoken){returntoR(sysUserService.logout(token));}2.2 service
com.yj.system.service.ISysUserService接口:
booleanlogout(Stringtoken);oj-modules/oj-system/src/main/java/com/yj/system/service/impl/SysUserServiceImpl.java实现:
@Overridepublicbooleanlogout(Stringtoken){if(StrUtil.isNotEmpty(token)&&token.startsWith(HttpConstants.PREFIX)){token=token.replaceFirst(HttpConstants.PREFIX,StrUtil.EMPTY);}returntokenService.deleteLoginUser(token,jwtSecret);}oj-common/oj-common-security/src/main/java/com/yj/common/security/service/TokenService.java:redis中删除缓存中的用户信息
publicbooleandeleteLoginUser(Stringtoken,StringjwtSecret){StringuserKey=getUserKey(token,jwtSecret);if(null==userKey)returnfalse;returnredisService.deleteObject((getTokenKey(userKey)));}