利用唯一索引来保证用户的唯一性,将邮箱字段作为唯一索引的字段
ALTER TABLE USER ADD UNIQUE(`mail`);
登录校验之JWT
JWT是一个开放标准,定义了一种用于简洁,自包含的用于通信双方之间以json对象的形式完全传递信息的方法,可以使用Hmac算法或者psa的公钥密钥对进行签名。
简单来说就是通过一定规范来生成token,然后可以通过解密算法逆向解密token,这样就可以获取用户信息。
?
?
?jwt工具类开发和解密token
?1、添加依赖
<!-- JWT依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
?需要将依赖添加到聚合工程和common中,并写好工具类
token是用户的登录后的一个令牌,之后访问接口只需要通过这个令牌来校验是否有权限访问。
/**
* JWT的工具类,用来生成token,解密token等
*/
@Slf4j
public class JWTUtil {
/**
* token过期时间,一般是七天方便测试,这里设置成了70天
*/
private static final long EXPIRE = 1000*60*60*24*7*10;
/**
* 秘钥
*/
private static final String SECRET = "xclass.net666";
/**
* 令牌前缀
*/
private static final String TOKEN_PREFIX = "xclass-1024shop";
/**
* 发布者
*/
private static final String SUBJECT = "xclasss";
/**
* 生成token的方法
* 需要传入一个登录的对象
* 根据用户信息生成令牌
* @return
*/
public static String geneJsonWebToken(LoginUser loginUser){
if(loginUser == null){
throw new NullPointerException("对象为空");
}
// 获取token
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 = TOKEN_PREFIX+token;
return token;
}
/**
* 校验token的方法
* 返回的claims相当于是一个map类型的数据结构
* @param token
* @return
*/
public static Claims checkJWT(String token){
try{
final Claims claims = Jwts.parser() // 通过解析器
// 解密
.setSigningKey(SECRET)
// 去调取前缀后获取
.parseClaimsJwt(token.replace(TOKEN_PREFIX,""))
.getBody();
return claims;
}catch(Exception e) { // token可能过期后不存在
log.info("jwt token 解密失败");
return null;
}
}
}
token自动刷新的实现
token过期后用户就无法正常访问了,因此需要自动刷新
但是这样违背了JWT的中心思想:去中心化,无状态化,
?
?为了避免token泄露被恶意使用,一般token会绑定ip,生成token的时候,加入ip信息,然后访问的时候,再获取token中的ip和当前的ip是否一致
|