Module bus.vortex

Class AuthorizeFilter

java.lang.Object
org.miaixz.bus.vortex.filter.AbstractFilter
org.miaixz.bus.vortex.filter.AuthorizeFilter
All Implemented Interfaces:
Filter, org.springframework.web.server.WebFilter

@Order(-2147483646) public class AuthorizeFilter extends AbstractFilter
访问鉴权过滤器,负责验证请求的合法性、方法、令牌和应用 ID

该过滤器是请求处理链中的重要组成部分,它通过检查请求的方法、版本、令牌和应用ID来验证请求的合法性。 过滤器会根据配置的资产信息验证请求的HTTP方法、令牌(如果需要)以及应用ID,确保只有合法的请求能够通过。

Since:
Java 17+
Author:
Justubborn
  • Constructor Details

    • AuthorizeFilter

      public AuthorizeFilter(AuthorizeProvider provider, AssetsRegistry registry)
      构造器,初始化授权提供者和资产注册表
      Parameters:
      provider - 授权提供者,用于处理令牌验证和授权逻辑
      registry - 资产注册表,用于存储和检索API资产信息
  • Method Details

    • doFilter

      protected reactor.core.publisher.Mono<Void> doFilter(org.springframework.web.server.ServerWebExchange exchange, org.springframework.web.server.WebFilterChain chain, Context context)
      内部过滤方法,执行授权验证逻辑

      该方法是过滤器的核心实现,负责执行完整的授权验证流程,包括: 1. 从请求中提取参数并设置上下文 2. 根据方法和版本查找对应的资产 3. 验证HTTP方法是否匹配 4. 如果需要,验证访问令牌 5. 验证应用ID是否匹配 6. 填充和清理请求参数 7. 将资产信息设置到上下文中

      Specified by:
      doFilter in class AbstractFilter
      Parameters:
      exchange - 当前的 ServerWebExchange 对象,包含请求和响应信息
      chain - 过滤器链,用于将请求传递给下一个过滤器
      context - 请求上下文,包含请求相关的状态信息
      Returns:
      reactor.core.publisher.Mono<Void> 表示异步处理完成,当所有验证通过后继续执行过滤器链
    • checkMethod

      protected void checkMethod(org.springframework.web.server.ServerWebExchange exchange, Assets assets)
      校验请求的 HTTP 方法是否匹配资产配置

      该方法检查当前请求的HTTP方法是否与资产配置中要求的方法一致。 如果不匹配,将根据期望的HTTP方法类型抛出不同的业务异常。

      Parameters:
      exchange - ServerWebExchange 对象,包含请求和响应信息
      assets - 资产信息,包含期望的HTTP方法类型
      Throws:
      org.miaixz.bus.core.lang.exception.BusinessException - 如果方法不匹配,抛出对应错误: - 对于GET方法,错误码为_100200 - 对于POST方法,错误码为_100201 - 对于其他方法,错误码为_100508
    • checkToken

      protected void checkToken(org.springframework.web.server.ServerWebExchange exchange, Context context, Assets assets, Map<String,String> params)
      校验令牌(如果资产要求)并将认证结果参数填充到请求参数中

      如果资产配置要求令牌验证,该方法将检查请求中是否包含有效的访问令牌。 如果令牌存在且有效,将从授权结果中提取用户信息并添加到请求参数中。 如果令牌缺失或无效,将抛出相应的业务异常。

      Parameters:
      exchange - ServerWebExchange 对象,包含请求和响应信息
      context - 上下文对象,包含令牌和通道信息
      assets - 资产信息,指示是否需要令牌验证
      params - 请求参数,将用于存储认证结果
      Throws:
      org.miaixz.bus.core.lang.exception.BusinessException - 如果令牌缺失或认证失败,抛出对应错误: - 令牌缺失时,错误码为_100106 - 令牌认证失败时,使用授权提供者返回的错误码和消息
    • checkAppId

      protected void checkAppId(org.springframework.web.server.ServerWebExchange exchange, Assets assets, Map<String,String> requestParam)
      校验应用 ID 是否匹配

      该方法验证请求中的应用ID是否与资产配置中的应用ID一致。 资产的应用ID是从方法名中提取的(方法名的第一部分)。 如果请求中未提供应用ID,会自动设置默认值。 如果提供了应用ID但不匹配,将抛出业务异常。

      Parameters:
      exchange - ServerWebExchange 对象,包含请求和响应信息
      assets - 资产信息,从中提取期望的应用ID
      requestParam - 请求参数,包含或将要包含应用ID
      Throws:
      org.miaixz.bus.core.lang.exception.BusinessException - 如果应用ID不匹配,抛出错误码为_100511的业务异常
    • fillXParam

      protected void fillXParam(org.springframework.web.server.ServerWebExchange exchange, Map<String,String> requestParam)
      填充 IP 参数到请求参数中

      该方法尝试从请求中提取客户端IP地址,并将其添加到请求参数中。 IP地址的提取顺序为: 1. 首先检查"x_remote_ip"请求头 2. 如果不存在,检查"X-Forwarded-For"请求头(处理代理情况) 3. 如果仍不存在,使用请求的远程地址

      Parameters:
      exchange - ServerWebExchange 对象,包含请求和响应信息
      requestParam - 请求参数,将向其中添加IP地址信息