前言
最近写项目需要用到登录的权限控制。本来想直接上 spring secrity 框架或者 shiro 框架的。 但是项目权限架构还比较简单,个人认为可能没必要弄得复杂。 所以直接将权限控制字段封装到了 token 里。
什么是 Jwt
JSON Web Token,通过数字签名的方式,以 ISON 对象为载体,在不同的服务终端之间安全的传输信息。 JWT 最常见的场景就是授权认证,一旦用户登录,后续每个请求都将包含 JWT,系统在每次处理用户请求的之前,都要先进行 JIWT 安全校验,通过之后再进行处理。
Jwt 的组成部分
1
2
3
4
| {
"type": "Jwt", //token类型
"alg": "HS256" // 机密算法
}
|
1
2
3
4
5
| {
"sub": "1234567890",
"name ": "john ",
"admin": true
}
|
- Signature 签名 对 Header 和 Payload 进行拼接与再次加密。
jwt 加密算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| // 加密算法
@Test
public void jwt(){
long time = 1000*60*60*24;
String signature = "admin";
JwtBuilder builder = Jwts.builder();
String token = builder
// 设置Header
.setHeaderParam("type","Jwt")
.setHeaderParam("alg","Hs256")
// 设置载荷Payload
.claim("role",1)
// 设置主题
.setSubject("jwt-test")
//设置过载时间
.setExpiration(new Date(System.currentTimeMillis()+time))
//设置id
.setId(UUID.randomUUID().toString())
//signature
.signWith(SignatureAlgorithm.HS256,signature)
.compact();
System.out.println(token);
}
|
解密算法
1
2
3
4
5
6
7
8
| @Test
public void parse(){
String token = "eyJ0eXBlIjoiSnd0IiwiYWxnIjoiSFMyNTYifQ.eyJyb2xlIjoxLCJzdWIiOiJqd3QtdGVzdCIsImV4cCI6MTYyNzQ1OTEwOCwianRpIjoiOWY4MmI0NTUtZDZmZC00OGM3LTkxZTItYzA3OWM3NzdmNjYxIn0.f4FNGap9cTmAtxt11swDtHk6YS9_voeu7jYwTz_OMkw";
JwtParser jwtParser = Jwts.parser();
Jws<Claims> claimsJes = jwtParser.setSigningKey("admin").parseClaimsJws(token);
Claims body = claimsJes.getBody();
System.out.println(body.get("role"));
}
|