过滤器的功能是检验经过网关的每一个请求,检查 token 中的信息是否有效。
注意是“认证检查”,而不是“权限”,权限是在每个服务的Controller上贴权限注解
1. 功能介绍
1、在用户完成登录后,程序会把用户相关的用户、角色、权限等信息临时存储在 redis 中,并把token返回给终端用户。
1、毕竟返回的token只存储了极其少量的用户信息,避免传输的数据量太大
2、RuoYi 返回的 token 中存储的信息有:
user_key:login_tokens:uuid(存入redis中用的)
user_id:userId
username:userName
2、当用户携带token时,我们判断 token 是否有效,关联的用户是否登录。如果token有效就把user_key、user_id、username 设置到请求头中
此处主要是检验 token 是否有效。
设置到请求头,统一处理,也方便其他模块
2. AuthFilter的配置
@Component
public class AuthFilter implements GlobalFilter, Ordered
{
private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
@Autowired
private RedisService redisService;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
{
...
}
}
AuthFilter 实现了GlobalFilter, Ordered,是一个全局过滤器,所有的模块都有。这也很好理解,所有的模块当然都需要检查 token 是否有效啊。
3. AuthFilter实现分析
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
{
ServerHttpRequest request = exchange.getRequest();
ServerHttpRequest.Builder mutate = request.mutate();
String url = request.getURI().getPath();
// 1、检验路径
if (StringUtils.matches(url, ignoreWhite.getWhites()))
{
return chain.filter(exchange);
}
String token = getToken(request);
// 2、是否有token
if (StringUtils.isEmpty(token))
{
return unauthorizedResponse(exchange, "令牌不能为空");
}
// 3、解析token,判断是否是有效的token
Claims claims = JwtUtils.parseToken(token);
if (claims == null)
{
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
}
String userkey = JwtUtils.getUserKey(claims);
// 4、判断用户是否登录
boolean islogin = redisService.hasKey(getTokenKey(userkey));
if (!islogin)
{
return unauthorizedResponse(exchange, "登录状态已过期");
}
String userid = JwtUtils.getUserId(claims);
String username = JwtUtils.getUserName(claims);
// 5、检查token是否有userId、userName
if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username))
{
return unauthorizedResponse(exchange, "令牌验证失败");
}
// 6、设置用户信息到请求
addHeader(mutate, SecurityConstants.USER_KEY, userkey);
addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid);
addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username);
// 7、内部请求来源参数清除
removeHeader(mutate, SecurityConstants.FROM_SOURCE);
return chain.filter(exchange.mutate().request(mutate.build()).build());
}
1、检验路径
路径uri白名单检验,如果是白名单,直接通过。
2、是否有token
3、解析token,判断是否是有效的token
只有有效的 token 才会解析出信息而不报错。
4、判断用户是否登录
auth 的权限校验有一个校验用户是否登录的注解。
5、检查token是否有userId、userName
6、设置用户信息到请求头
7、内部请求来源参数清除
8、继续下一个过滤器文章来源:https://www.toymoban.com/news/detail-729830.html
4. 资料参考
语雀笔记地址:https://www.yuque.com/yuchangyuan/tkb5br文章来源地址https://www.toymoban.com/news/detail-729830.html
到了这里,关于【RuoYi-Cloud项目研究】【ruoyi-gateway模块】网关的AuthFilter完成“认证”,注意是认证而不是权限的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!