用户鉴权
# JWT组成
Header(头部):包含了关于生成的 JWT 的元数据信息,例如算法和令牌类型;
Payload(负载):包含了实际的声明(claim)信息,这些声明是关于实体(通常是用户)和其他数据的信息。有三种类型的声明:注册声明、公共声明和私有声明;
Signature(签名):用于验证JWT的完整性,确保数据在传输过程中没有被篡改。签名是基于头部和负载,使用一个密钥(秘密或公开的)进行加密生成的;
# JWT作用
- 身份验证:用户登录后,可以生成JWT并将其存储在客户端,然后在后续请求中使用它来证明身份;
- 授权:JWT可以包含用户的授权信息,以便在服务器端验证用户是否有权限执行某个操作或访问某个资源;
- 信息交换:JWT可用于在不同系统之间安全地传递信息,例如在微服务架构中进行服务之间的通信;
# 鉴权过滤器
@Slf4j
@FilterAspect(id= AUTH_FILTER_ID,
name = AUTH_FILTER_NAME,
order =AUTH_FILTER_ORDER )
public class AuthFilter implements Filter {
/**
* 加密密钥
*/
private static final String SECRET_KEY = "Nreal";
/**
* cookie键 从对应的cookie中获取到这个键 存储的就是我们的token信息
*/
private static final String COOKIE_NAME = "blossomgateway-jwt";
@Override
public void doFilter(GatewayContext ctx) throws Exception {
//检查是否需要用户鉴权
if (ctx.getRule().getFilterConfig(AUTH_FILTER_ID) == null) {
return;
}
String token = ctx.getRequest().getCookie(COOKIE_NAME).value();
if (StringUtils.isBlank(token)) {
throw new ResponseException(ResponseCode.UNAUTHORIZED);
}
try {
//解析用户id
long userId = parseUserId(token);
//把用户id传给下游
ctx.getRequest().setUserId(userId);
} catch (Exception e) {
throw new ResponseException(ResponseCode.UNAUTHORIZED);
}
}
/**
* 根据token解析用户id
* @param token
* @return
*/
private long parseUserId(String token) {
Jwt jwt = Jwts.parser().setSigningKey(SECRET_KEY).parse(token);
return Long.parseLong(((DefaultClaims)jwt.getBody()).getSubject());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48