👨💻单体项目登录快速应用
redis + jwt
使用
依赖
<dependency>
<groupId>com.detabes</groupId>
<artifactId>webs-jwt-redis</artifactId>
<version>{last.version}</version>
</dependency>redis配置
spring:
redis:
database: 6
host: 127.0.0.1
port: 9999
password: 123456登录接口编写
@ApiOperation(value = "用户登录", notes = "用户管理")
@ResponseBody
@ApiMapping(value = "login", checkToken = false, method = RequestMethod.POST)
public ResultVO<LoginVO> login(@RequestBody @Valid LoginDTO loginDTO, HttpServletRequest request) {
// 1. 查询账户正确性(省略)
AuthUserEntity authUserEntity = find();
// 2. 验证密码正确性(省略)
verifyUserPass();
String sign;
try {
// 3. 查询用户是否已经登录过
StorageUserTokenEntity storageUserTokenEntity = redisService.loadUserTokenInfoBySubject(authUserEntity.getNo());
// 存在则返回
sign = storageUserTokenEntity.getToken();
} catch (Exception e) {
// 4. 未登录则办法token
sign = JwtRedisUtil.sign(SignEntity.builder()
.alwaysOnline(false)
.subject(authUserEntity.getNo())
.map(ImmutableMap.of("name", authUserEntity.getName(),
"loginName", authUserEntity.getLoginName()))
.build()
);
}
// 5. 存储用户状态信息
RedisAccount<String> redisAccount = new RedisAccount<>();
redisAccount.setUserCode(authUserEntity.getNo());
redisAccount.setPassword(authUserEntity.getLoginPwd());
redisAccount.setSalt(authUserEntity.getNo());
// 是否禁用
boolean account = authUserEntity.disabledAccount();
redisAccount.setDisabledAccount(account);
// 是否锁定账户 = 本项目没有锁定状态
redisAccount.setExcessiveAttempts(false);
redisAccount.setUserInfo(JSON.toJSONString(authUserEntity));
redisService.storageUserStatus(redisAccount);
// 6. 返回前端登录情况
LoginVO login = LoginVO.builder().token(sign).build();
Assert.isFalse(account, () -> new UserException(UserExceptionEnum.BANNED_ACCOUNT));
return ResultVO.success(login, "登录成功");
}功能如下
JwtRedisUtil工具类
JwtRedisUtil.sign 颁发token时会将token存一份到redis
JwtRedisUtil.verity 验证token时会刷新
RedisService服务
存放 用户TOKEN
刷新 用户token
删除 用户TOKEN
验证 用户TOKEN是否存在,存在则返回 token
存储 用户的状态
验证 用户的状态 (有问题则异常
存放 用户角色
加载 用户角色
WebApiInterceptor 全局拦截器
token 有效验证
token 刷新(默认使用token就会重置过期时间为默认值)
@NotRefreshToken不刷新token的注解@ApiMapping接口是否拦截注解
重写 WebApiInterceptor 全局拦截器 中的token处理方法
非必要不使用此功能
新建重写方法实现CheckTokenInterceptor
@JoinSPI
构建SPI
1位置固定 resources/META-INF/detabes
文件名固定 com.detabes.jwtweb.server.CheckTokenInterceptor
方法名固定 defaultInterceptor
自定义实现类 com.detabes.build.interceptor.RedisInterceptor
Last updated