👨‍💻单体项目登录快速应用

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工具类

  1. JwtRedisUtil.sign 颁发token时会将token存一份到redis

  2. JwtRedisUtil.verity 验证token时会刷新

RedisService服务

  1. 存放 用户TOKEN

  2. 刷新 用户token

  3. 删除 用户TOKEN

  4. 验证 用户TOKEN是否存在,存在则返回 token

  5. 存储 用户的状态

  6. 验证 用户的状态 (有问题则异常

  7. 存放 用户角色

  8. 加载 用户角色

WebApiInterceptor 全局拦截器

  1. token 有效验证

  2. token 刷新(默认使用token就会重置过期时间为默认值)

  3. @NotRefreshToken不刷新token的注解

  4. @ApiMapping 接口是否拦截注解

重写 WebApiInterceptor 全局拦截器 中的token处理方法

非必要不使用此功能

  1. 新建重写方法实现CheckTokenInterceptor

@JoinSPI

  1. 构建SPI

  • 1位置固定 resources/META-INF/detabes

  • 文件名固定 com.detabes.jwtweb.server.CheckTokenInterceptor

  • 方法名固定 defaultInterceptor

  • 自定义实现类 com.detabes.build.interceptor.RedisInterceptor

Last updated