用户登陆功能开发

登陆功能核心逻辑

  • 通过mail找数据库记录
  • 获取盐,和当前传递的密码
  • 生成token令牌

登陆功能实现

依赖

        <!-- JWT相关 -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.7.0</version>
        </dependency>

登陆请求vo controller用到

@Data
@ApiModel(value = "登录对象",description = "用户登录请求对象")
public class UserLoginRequest {

    @ApiModelProperty(value = "邮箱", example = "794666918@qq.com")
    private String mail;

    @ApiModelProperty(value = "密码", example = "123456")
    private String pwd;
    
}

用户信息vo Jwt工具类用到

@Data
public class LoginUser {

    /**
     * 主键
     */
    private Long id;

    /**
     * 名称
     */
    private String name;

    /**
     * 头像
     */
    @JsonProperty("head_img")
    private String headImg;

    /**
     * 邮箱
     */
    private String mail;
}

Jwt 工具类

@Slf4j
public class JWTUtil {
    /**
     * token 过期时间,正常是7天,方便测试我们改为70
     */
    private static final long EXPIRE = 1000 * 60 * 60 * 24 * 7 * 10;

    /**
     * 加密的秘钥
     */
    private static final String SECRET = "xdclass.net666";

    /**
     * 令牌前缀
     */
    private static final String TOKEN_PREFIX = "xdclass1024shop";

    /**
     * subject
     */
    private static final String SUBJECT = "xdclass";
    
    /**
     * 根据用户信息,生成令牌
     *
     * @param loginUser
     * @return
     */
    public static String geneJsonWebToken(LoginUser loginUser) {
        if (loginUser == null) {
            throw new NullPointerException("loginUser对象为空");
        }
        String token = Jwts.builder().setSubject(SUBJECT)
                //payload
                .claim("head_img", loginUser.getHeadImg())
                .claim("id", loginUser.getId())
                .claim("name", loginUser.getName())
                .claim("mail", loginUser.getMail())
                .setIssuedAt(new Date()) // 配置发布时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) // 配置过期时间
                .signWith(SignatureAlgorithm.HS256, SECRET) // 配置使用的算法
                .compact(); // 返回字符串
        token = TOKEN_PREFIX + token;
        return token;
    }
    
    /**
     * 校验token的方法
     *
     * @param token
     * @return
     */
    public static Claims checkJWT(String token) {
        try {
            // 解密token
            final Claims claims = Jwts.parser()
                    .setSigningKey(SECRET) // 设置登陆秘钥
                    .parseClaimsJws(token.replace(TOKEN_PREFIX, "")) // 去到 token 前缀, 转换成jws
                    .getBody();
            return claims;
        } catch (Exception e) {
            log.info("jwt token解密失败");
            return null;
        }
    }
}

serviceImpl

    /**
     * 1、根据Mail去找有没这记录
     * 2、有的话,则用秘钥+用户传递的明文密码,进行加密,再和数据库的密文进行匹配
     *
     * @param userLoginRequest
     * @return
     */
    @Override
    public JsonData login(UserLoginRequest userLoginRequest) {

        List<UserDO> userDOList =  userMapper.selectList(new QueryWrapper<UserDO>().eq("mail",userLoginRequest.getMail())); 

        if(userDOList!=null && userDOList.size()==1){
            //已经注册
            UserDO userDO = userDOList.get(0);
            String cryptPwd = Md5Crypt.md5Crypt(userLoginRequest.getPwd().getBytes(),userDO.getSecret());
            if(cryptPwd.equals(userDO.getPwd())){
                //登录成功,生成token TODO

                LoginUser loginUser = new LoginUser();
                BeanUtils.copyProperties(userDO,loginUser);

                String accessToken = JWTUtil.geneJsonWebToken(loginUser);
                // accessToken
                // accessToken的过期时间
                // UUID生成一个token
                //String refreshToken = CommonUtil.generateUUID();
                //redisTemplate.opsForValue().set(refreshToken,"1",1000*60*60*24*30);

                return JsonData.buildSuccess(accessToken);

            }else {

                return JsonData.buildResult(BizCodeEnum.ACCOUNT_PWD_ERROR);
            }
        }else {
            //未注册
            return JsonData.buildResult(BizCodeEnum.ACCOUNT_UNREGISTER);
        }


    }
posted @ 2022-10-28 17:19  哨音  阅读(48)  评论(0编辑  收藏  举报