1.JWT
JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
2.优点
1.无状态
2.有效避免了CSRF 攻击(跨站请求伪造,属于网络攻击领域范围)
3.适合移动端应用
4.单点登录友好(SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。)
@Slf4j
public class JwtUtil {
//过期时间 30min
private static final int EXPIRE_TIME = 30;
//私钥
private static final String TOKEN_SECRET = "privateKey";
//可以自定义
/**
* 签发对象:这个用户的id
* 签发时间:现在
* 有效时间:30分钟
* 载荷内容:暂时设计为:这个人的名字
* 加密密钥:这个人的id加上一串字符串
* @param userId
* @return
*/
public static String createToken(Long userId,List<String> authStrList) {
// 算出一个超时的时间
Calendar nowTime = Calendar.getInstance();
nowTime.add(Calendar.MINUTE,EXPIRE_TIME);
Date expiresDate = nowTime.getTime();
return JWT.create()
.withAudience(userId+"") //签发对象
.withIssuedAt(new Date()) //发行时间
.withExpiresAt(expiresDate) //有效时间
// authStrList=> 转json 存储 => 尝试fastjson(阿里开源的一个json转化工具)
// .withClaim(USER_NAME, userName) //载荷,随便写几个都可以
.sign(Algorithm.HMAC256(userId+TOKEN_SECRET)); //加密
}
/**
* 检验合法性,其中secret参数就应该传入的是用户的id
* @param token
*/
public static boolean verifyToken(String token, String secret){
try {
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret+TOKEN_SECRET)).build();
verifier.verify(token);
} catch (Exception e) {
//效验失败
//自定义的一个异常
log.error("token校验失败",e);
return false;
}
return true;
}
/**
* 获取签发对象 => userId
*/
public static String getAudience(String token){
String audience = null;
try {
audience = JWT.decode(token).getAudience().get(0);
} catch (JWTDecodeException j) {
//这里是token解析失败
log.error("token解析失败",j);
return null;
}
return audience;
}
/**
* 获取签发对象 => userId
*/
public static List<String> getClaim(String token, String key){
try {
Claim claim = JWT.decode(token).getClaim("key");
// 转化成对应类型 。。。
} catch (JWTDecodeException j) {
//这里是token解析失败
log.error("token解析失败",j);
return null;
}
return null;
}
}
3.使用
在登录controller中,其中要注意你的user必须有token这个属性
// 视图字段:用户令牌信息
@TableField(exist=false)
private String token;
// 视图字段:权限信息
@TableField(exist=false)
private List<String> authStrList;
List<String> authStrList = userService.getAuthStrListByUserId(userDb.getId());
// 权限信息存储到用户信息中
userDb.setAuthStrList(authStrList);
String token = JwtUtil.createToken(userDb.getId(),authStrList);
userDb.setToken(token);