登陆功能核心逻辑
- 通过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. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性