用户登陆功能开发
登陆功能核心逻辑
- 通过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);
}
}
吾生也有涯,而知也无涯。