当前位置: 首页 > java >正文

【Easylive】AdminFilter 详细解析

【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版
AdminFilter 详细解析

AdminFilter 是一个 Spring Cloud Gateway 的过滤器,用于在请求到达微服务之前进行 权限校验(如管理员 Token 验证)。以下是逐行解析:


1. 类定义与基础结构

@Component
@Slf4j
public class AdminFilter extends AbstractGatewayFilterFactory {

@Component:声明为 Spring Bean,由 Spring 管理生命周期。

@Slf4j:集成 Lombok,提供日志功能(如 log.error())。

AbstractGatewayFilterFactory:Spring Cloud Gateway 过滤器的基类,用于自定义路由过滤逻辑。


2. 常量定义

private final static String URL_ACCOUNT = "/account";
private final static String URL_FILE = "/file";

URL_ACCOUNT:放行路径,访问 /account 的请求无需 Token(如登录、注册接口)。

URL_FILE:特殊路径,文件相关接口从 Cookie 中提取 Token(而非 Header)。


3. 核心过滤逻辑 (apply)

@Override
public GatewayFilter apply(Object config) {return (exchange, chain) -> {ServerHttpRequest request = exchange.getRequest();

apply:覆盖父类方法,返回一个 GatewayFilter 实例。

exchange:封装了 HTTP 请求和响应的上下文(类似 Servlet 的 HttpServletRequest/Response)。

chain:过滤器链,调用 chain.filter(exchange) 继续执行后续过滤器或路由到目标服务。


4. 路径判断与 Token 提取
(1) 放行 /account 路径

if (request.getURI().getRawPath().contains(URL_ACCOUNT)) {return chain.filter(exchange); // 直接放行
}

• 逻辑:如果请求路径包含 /account(如登录接口),跳过 Token 校验。

(2) 文件接口从 Cookie 取 Token

if (request.getURI().getRawPath().contains(URL_FILE)) {token = getTokenFromCookie(request); // 从 Cookie 获取
}

• 适用场景:文件上传/下载可能通过浏览器发起,而浏览器通常将 Token 放在 Cookie 而非 Header。

(3) 默认从 Header 取 Token

String token = getToken(request); // 从 Header 获取

• Header 键名:Constants.TOKEN_ADMIN(如 X-Admin-Token)。


5. Token 校验

if (StringTools.isEmpty(token)) {throw new BusinessException(ResponseCodeEnum.CODE_901); // 抛出"无权限"异常
}

• 校验规则:

• 如果 Token 为空,抛出业务异常(CODE_901 可能表示 “未登录” 或 “Token 无效”)。

• 如果 Token 有效,继续执行后续逻辑(chain.filter(exchange))。


6. Token 提取方法
(1) 从 Header 获取

private String getToken(ServerHttpRequest request) {return request.getHeaders().getFirst(Constants.TOKEN_ADMIN);
}

• 示例:

请求 Header 需包含:

GET /api/admin/users HTTP/1.1
X-Admin-Token: abc123xyz

(2) 从 Cookie 获取

private String getTokenFromCookie(ServerHttpRequest request) {return request.getCookies().getFirst(Constants.TOKEN_ADMIN).getValue();
}

• 示例:

浏览器请求会自动携带 Cookie:

GET /file/download/1 HTTP/1.1
Cookie: ADMIN_TOKEN=abc123xyz

7. 设计思想总结

关键点说明
职责分离将权限校验逻辑集中到网关层,避免每个微服务重复实现。
灵活提取 Token支持 Header 和 Cookie 两种方式,适配不同场景(如 API 调用 vs 浏览器文件下载)。
白名单路径/account 路径免校验,确保登录/注册接口可访问。
异常处理直接抛出业务异常,由网关统一转换为 HTTP 响应(如 401 Unauthorized)。

8. 使用场景示例
(1) 管理员访问用户列表

GET /admin/users HTTP/1.1
X-Admin-Token: valid_token_here

• 流程:

  1. 网关检查路径不匹配 /account/file
  2. 从 Header 提取 X-Admin-Token
  3. 校验通过,转发请求到用户微服务。

(2) 用户下载文件

GET /file/download/1 HTTP/1.1
Cookie: ADMIN_TOKEN=valid_token_here

• 流程:

  1. 网关识别路径包含 /file
  2. 从 Cookie 提取 ADMIN_TOKEN
  3. 校验通过,转发请求到文件微服务。

(3) 未携带 Token 的请求

GET /admin/users HTTP/1.1

• 结果:抛出 CODE_901 异常,返回 401 Unauthorized


总结
AdminFilter 是网关层的 统一权限守卫,通过 路径判断 和 多方式 Token 提取,确保只有合法请求能访问后端服务。它的设计体现了网关的核心价值:集中式管控跨横切面逻辑。

http://www.xdnf.cn/news/880.html

相关文章:

  • Sentinel源码—7.参数限流和注解的实现一
  • 经典算法 输出在环上的点
  • 【阿里云大模型高级工程师ACP学习笔记】2.1 用大模型构建新人答疑机器人
  • 绿色体育直播赛事扁平自适应M25直播模板源码
  • Qt项目——汽车仪表盘
  • git详解
  • Vue v-for 循环DOM 指定dom个数展示一行
  • 【图像变换】pytorch-CycleGAN-and-pix2pix的学习笔记
  • Git 大文件使用 Git-LFS 管理,推送失败
  • .NET WPF 三维模型
  • 【xlog日志文件】怎么删除里面包含某些字符串的行(使用excel)
  • 垂直行业突围:工业软件在汽车、航空领域的 “破壁” 实践
  • 星云智控科技-优雅草星云物联网AI智控系统软件产品技术栈一览表-优雅草卓伊凡
  • android的 framework 是什么
  • 【MySQL】数据库安装
  • 第十四届蓝桥杯 2023 C/C++组 平方差
  • NLTK 基础入门:用 Python 解锁自然语言处理
  • 【回眸】error: failed to compile `xxxxxx`重装rust环境
  • 【数据结构和算法】4. 链表 LinkedList
  • 87233系列USB连续波功率探头
  • git远程分支重命名(纯代码操作)
  • 【FFmpeg从入门到精通】第四章-FFmpeg转码
  • PyTorch 线性回归详解:模型定义、保存、加载与网络结构
  • 回车键监听
  • MYSQL之基础认识(卸载安装登录, 基本概念)
  • 【日志体系】ELK Stack与云原生日志服务
  • go for 闭环问题【踩坑记录】
  • 解决Mac 安装 PyICU 依赖失败
  • 反向传播思想
  • 【Flask】Explore-Flask:早期 Flask 生态的实用指南