登陆功能核心逻辑

  • 通过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);
        }


    }

原文地址:http://www.cnblogs.com/isChenJY/p/16836805.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性