使用spring和nuxt搭建用户登录功能

 2023-02-19 20:39:39  阅读 0

 

文章主要使用JWT进行用户的登录以及验证,JWT是可以将用户的一些基本信息以及登录需要的Token封存,前端随时用随时取即可,JWT是一个工具类可以直接导入,引入JWTUtils工具类
 


二、创建UserInfo

将前端需要的用户属性进行封装
 

@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;
}

 

六、总结

综上所述都是公司级项目的实战
 

标签:

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码