Spring boot(五)-登录注册

135 阅读1分钟
  • jwt 依赖
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>4.1.0</version>
</dependency>
  • 用户表
create table if not exists `genshin_admin_user`(
    `id` varchar(32) primary key not null comment '用户id',
    `title` varchar(32) not null comment '头衔',
    `name` varchar(32) not null comment '姓名',
    `user_name` varchar(32) not null comment '账号',
    `sex` int(1) not null comment '0-女 1-男',
    `password` varchar(32) not null comment '密码',
    `token` varchar(32) not null comment 'token',
    `create_time` datetime not null comment '创建时间',
    `update_time` datetime not null comment '更新时间'
)engine=InnoDB default charset=utf8mb4;
  • 随机生成用户id工具类
public class Utill {
    /*
     @ 生产随机字符串
     @param int 位数
     */
    public static String getRandomString(int length) {
        Random random=new Random();
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<length;i++) {
            int number = random.nextInt(3);
            int result = 0;
            switch (number) {
                case 0:
                    result = (int) (Math.random() * 25 + 65);
                    sb.append((char) result);
                    break;
                case 1:
                    result = (int) (Math.random() * 25 + 97);
                    sb.append((char) result);
                    break;
                case 2:
                    sb.append(new Random().nextInt(10));
                    break;
            }
        }
        return sb.toString();
    }
}
  • 注册
@RestController
@Slf4j
@RequestMapping("/user")
public class AdminUserController {

    @Autowired
    private AdminUserService adminUserService;

    @PostMapping("/register")
    public GResponse register(@RequestBody AdminUser user) {
        String id = Utill.getRandomString(32);
        String password = user.getPassword();
        String encryption = DigestUtils.md5DigestAsHex(password.getBytes());
        LocalDateTime time = LocalDateTime.now();
        user.setId(id);
        user.setPassword(encryption);
        user.setCreateTime(time);
        user.setUpdateTime(time);
        user.setToken("");
        log.info(user.getUserName());
        boolean save = adminUserService.save(user);
        if (!save) {
            return GResponse.error("注册失败!");
        }
        return GResponse.success("注册成功");
    }
}
  • token 工具类
public class TokenUtil {

    private static final long EXPIRE_TIME = 15 * 60 * 1000; // 有效期 15分钟
    private static final String TOKEN_SECRET = "genshin"; // 密钥

    // 生成签名
    public  static String sign(String userId) {
        try {
            Date expiresAt = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            String token = JWT.create()
                    .withIssuer("auth0")
                    .withClaim("id","id") // 自定存放数据
                    .withClaim("userId",userId)
                    .withExpiresAt(expiresAt) // 过期时间
                    .sign(Algorithm.HMAC256(TOKEN_SECRET));
            return token;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    // 签名验证
    public static Boolean verify(String token) {
        try {
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).withIssuer("auth0").build();
            verifier.verify(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    
  
   // 解析token 获取用户ID
   public static String getUserIDByToken(String token) {
       try {
           
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).withIssuer("auth0").build();
            DecodedJWT decodedVerify = verifier.verify(token);
            String issuer = decodedVerify.getIssuer();
            String userId = decodedVerify.getClaim("userId").asString();
            return userId;
        } catch (Exception e) {
            return "";
        }
    }
}
  • AdminUserService
public AdminUser getAdminUserByUserName(String userName);
  • AdminUserImpl
@Autowired
private AdminUserMapper adminUserMapper;

@Override
public AdminUser getAdminUserByUserName(String userName) {
    LambdaQueryWrapper<AdminUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.eq(Strings.isNotEmpty(userName),AdminUser::getUserName,userName);
    return adminUserMapper.selectOne(lambdaQueryWrapper);
}
  • 登录
@PostMapping("/login")
public GResponse login(@RequestBody AdminUser user) {
    String password = user.getPassword();
    String encryption = DigestUtils.md5DigestAsHex(password.getBytes());

    AdminUser adminUser = adminUserService.getAdminUserByUserName(user.getUserName());
    if (adminUser == null) {
        return GResponse.error("没找到相关用户!");
    }
    if (!adminUser.getPassword().equals(encryption)) {
        return GResponse.error("密码错误!");
    }
    String token = TokenUtil.sign(adminUser.getId());
    adminUser.setToken(token);
    return GResponse.success("登录成功",adminUser);
}
  • 拦截器验证
@Slf4j
public class AuthenticationInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取拦截的请求
        String requestURI = request.getRequestURI();
        log.info("拦截的请求-: " + requestURI);
        // 获取请求header中的token
        String token = request.getHeader("token");
        // 未登录
        if (token == null || !TokenUtil.verify(token)) {
            response.getWriter().write(JSON.toJSONString(GResponse.error("not login!")));
            return false;
        }
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }
}