文章主要使用JWT进行用户的登录以及验证,JWT是可以将用户的一些基本信息以及登录需要的Token封存,前端随时用随时取即可,JWT是一个工具类可以直接导入,引入JWTUtils工具类
将前端需要的用户属性进行封装
@ApiModel(description = "用户信息对象")
public class UserInfoVO {
@ApiModelProperty(value = "用户姓名")
private String name;
@ApiModelProperty(value = "用户昵称")
private String nickName;
@ApiModelProperty(value = "用户头像")
private String headImg;
@ApiModelProperty(value = "用户手机号")
private String mobile;
@ApiModelProperty(value = "用户类型 1:出借人 2:借款人")
private Integer userType;
@ApiModelProperty(value = "JWT访问令牌")
private String token;
}
三、Contorller层
Contoller层代码如下,实现基本的登录逻辑即可
@ApiOperation("会员登录")
@PostMapping("/login")
public R login(@RequestBody LoginVO loginVO, HttpServletRequest request) {
String mobile = loginVO.getMobile();
String password = loginVO.getPassword();
// 校验用户输入
Assert.notEmpty(mobile, ResponseEnum.MOBILE_NULL_ERROR);
Assert.notEmpty(password, ResponseEnum.PASSWORD_NULL_ERROR);
String ip = request.getRemoteAddr();
UserInfoVO userInfoVO = userInfoService.login(loginVO, ip);
return R.ok().data("userInfo", userInfoVO);
}
四、Service层
Service层需要对JWT令牌进行验证,JWT令牌包含用户的信息以及Token
@Transactional(rollbackFor = Exception.class)
@Override
public UserInfoVO login(LoginVO loginVO, String ip) {
String mobile = loginVO.getMobile();
String password = loginVO.getPassword();
Integer userType = loginVO.getUserType();
// 判断用户是否存在
UserInfo userInfo = baseMapper.selectOne(
new LambdaQueryWrapper<UserInfo>()
.eq(UserInfo::getMobile, mobile)
.eq(UserInfo::getUserType, userType));
Assert.notNull(userInfo, ResponseEnum.LOGIN_MOBILE_ERROR);
// 判断密码是否正确
Assert.equals(MD5.encrypt(password), userInfo.getPassword(), ResponseEnum.LOGIN_PASSWORD_ERROR);
// 判断用户是否被禁用
Assert.equals(userInfo.getStatus(), UserInfo.STATUS_NORMAL, ResponseEnum.LOGIN_LOKED_ERROR);
// 记录登录日志
UserLoginRecord userLoginRecord = new UserLoginRecord();
userLoginRecord.setUserId(userInfo.getId());
userLoginRecord.setIp(ip);
userLoginRecordMapper.insert(userLoginRecord);
// 生成token
String token = JwtUtils.createToken(userInfo.getId(), userInfo.getName());
// 封装UserInfoVO
UserInfoVO userInfoVO = new UserInfoVO();
userInfoVO.setToken(token);
userInfoVO.setName(userInfo.getName());
userInfoVO.setNickName(userInfo.getNickName());
userInfoVO.setHeadImg(userInfo.getHeadImg());
userInfoVO.setMobile(mobile);
userInfoVO.setUserType(userType);
return userInfoVO;
}
五、JWT生成Token如下 这个工具类可以直接引入
public static String createToken(Long userId, String userName) {
String token = Jwts.builder()
.setSubject("SRB-USER")
.setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
.claim("userId", userId)
.claim("userName", userName)
.signWith(SignatureAlgorithm.HS512, getKeyInstance())
.compressWith(CompressionCodecs.GZIP)
.compact();
return token;
}
六、总结
综上所述都是公司级项目的实战