首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于SpringWebFlux框架的拦截器(或过滤器)实现,用于处理请求的认证和授权逻辑

基于SpringWebFlux框架的拦截器(或过滤器)实现,用于处理请求的认证和授权逻辑

作者头像
命运之光
发布2025-07-10 08:17:36
发布2025-07-10 08:17:36
24500
代码可运行
举报
运行总次数:0
代码可运行

这段代码是一个基于Spring WebFlux框架的拦截器(或过滤器)实现,用于处理请求的认证和授权逻辑。

业务中常见代码

整体设计思路

这个过滤器的核心目标是对每个HTTP请求进行拦截,验证用户身份并检查访问权限。它采用了典型的"先放行公开路径,再验证需授权路径"的策略,遵循以下步骤:

  1. 获取请求的基本信息(方法和路径)
  2. 判断是否为无需认证的公开路径
  3. 从请求头中提取认证信息(token)并验证
  4. 将用户信息传递给后续处理
  5. 检查用户是否有权限访问该路径
  6. 放行请求到下一个处理环节
详细实现步骤
1. 获取请求信息
代码语言:javascript
代码运行次数:0
运行
复制
ServerHttpRequest request = exchange.getRequest();
String method = request.getMethodValue();
String path = request.getPath().toString();
String antPath = method + ":" + path;
  • ServerWebExchange 是WebFlux中表示HTTP请求-响应交换的核心接口
  • 通过它获取请求对象后,可以提取HTTP方法(GET/POST等)和请求路径
  • 将方法和路径组合成一个字符串(如"GET:/api/users"),便于后续匹配
2. 判断是否为公开路径
代码语言:javascript
代码运行次数:0
运行
复制
if(isExcludePath(antPath)){
    return chain.filter(exchange);
}
  • isExcludePath 是一个自定义方法,用于判断当前请求是否属于无需认证的路径列表
  • 常见的公开路径包括登录接口、注册接口、静态资源等
  • 如果是公开路径,直接放行请求,不进行后续认证和授权检查
3. 提取并验证token
代码语言:javascript
代码运行次数:0
运行
复制
List<String> authHeaders = exchange.getRequest().getHeaders().get(AUTHORIZATION_HEADER);
String token = authHeaders == null ? "" : authHeaders.get(0);
R<LoginUserDTO> r = authUtil.parseToken(token);
  • 从请求头中提取 Authorization 字段,通常格式为 Bearer <token>
  • authUtil.parseToken 是自定义工具方法,用于验证token的有效性并解析用户信息
  • R<LoginUserDTO> 是自定义的响应结果类,包含操作结果和用户数据
4. 传递用户信息
代码语言:javascript
代码运行次数:0
运行
复制
if(r.success()){
    exchange.mutate()
            .request(builder -> builder.header(USER_HEADER, r.getData().getUserId().toString()))
            .build();
}
  • 如果token验证成功,从结果中获取用户信息(如用户ID)
  • 通过 ServerWebExchange.mutate() 方法修改请求,添加一个自定义请求头(如 X-User-Id
  • 这样后续的处理组件(如控制器)可以通过请求头获取当前用户信息
5. 权限检查
代码语言:javascript
代码运行次数:0
运行
复制
authUtil.checkAuth(antPath, r);
  • authUtil.checkAuth 是自定义的权限检查方法
  • 它根据请求路径和用户信息判断用户是否有权限访问该资源
  • 如果权限不足,通常会抛出异常(如 AccessDeniedException),由全局异常处理器统一处理
6. 放行请求
代码语言:javascript
代码运行次数:0
运行
复制
return chain.filter(exchange);
  • 所有检查通过后,调用 FilterChainfilter 方法将请求传递给下一个过滤器或最终处理程序
可能存在的问题

这段代码有一个潜在的问题:在第4步修改请求头后,没有将修改后的 ServerWebExchange 赋值回变量。正确的写法应该是:

代码语言:javascript
代码运行次数:0
运行
复制
if(r.success()){
    ServerWebExchange mutatedExchange = exchange.mutate()
            .request(builder -> builder.header(USER_HEADER, r.getData().getUserId().toString()))
            .build();
    return chain.filter(mutatedExchange);
}

否则修改的请求头不会生效,后续组件无法获取用户信息。

总结

这个过滤器实现了一个完整的认证授权流程,通过拦截所有请求,区分公开路径和受保护路径,验证用户身份并检查访问权限,确保系统安全。它体现了Spring WebFlux的函数式编程风格和过滤器链设计模式。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 整体设计思路
  • 详细实现步骤
    • 1. 获取请求信息
    • 2. 判断是否为公开路径
    • 3. 提取并验证token
    • 4. 传递用户信息
    • 5. 权限检查
    • 6. 放行请求
  • 可能存在的问题
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档