Soul网关(十八)----context-path-mapping 插件和 sign 插件

context-path-mapping 插件和 sign 插件

    • context-path-mapping插件
      • 使用
      • 关键源码
    • sign 插件
      • 使用
      • 源码分析

context-path-mapping插件

context-path-mapping插件用于对请求URI进行重写

使用

soul-bootstrap的 pom.xml 文件中添加 context_path 的支持。

  <dependency>
      <groupId>org.dromaragroupId>
      <artifactId>soul-spring-boot-starter-plugin-context-pathartifactId>
     <version>${project.version}version>
  dependency>

soul-admin –> 插件管理 –> context_path 设置为开启。并配置重写选择器和规则。

关键源码

protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
     
  	// 获取请求上下文
    final SoulContext soulContext = exchange.getAttribute(Constants.CONTEXT);
    assert soulContext != null;
    final String handle = rule.getHandle();
  	// 从规则中获取配置的重写路径
    final ContextMappingHandle contextMappingHandle = GsonUtils.getInstance().fromJson(handle, ContextMappingHandle.class);
    if (Objects.isNull(contextMappingHandle) || StringUtils.isBlank(contextMappingHandle.getContextPath())) {
     
        log.error("context path mapping rule configuration is null :{}", rule);
        return chain.execute(exchange);
    }
    // 检查路径是否合法
    if (!soulContext.getPath().startsWith(contextMappingHandle.getContextPath())) {
     
      	// 不合法则直接返回错误码
        Object error = SoulResultWrap.error(SoulResultEnum.CONTEXT_PATH_ERROR.getCode(), SoulResultEnum.CONTEXT_PATH_ERROR.getMsg(), null);
        return WebFluxResultUtils.result(exchange, error);
    }
    // 重写URI,构建上下文
    this.buildContextPath(soulContext, contextMappingHandle);
  	// 请求放行到下一个插件
    return chain.execute(exchange);
}

sign 插件

sign插件用来对请求进行签名认证

使用

  • soul-bootstrap的 pom.xml 文件中添加依赖

      <dependency>
          <groupId>org.dromaragroupId>
          <artifactId>soul-spring-boot-starter-plugin-signartifactId>
         <version>${project.version}version>
      dependency>
    
  • soul-admin -> 插件管理中 –> sign插件设置为开启。并配置选择器和规则

源码分析

protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
     
    // 验证签名
    Pair<Boolean, String> result = signService.signVerify(exchange);
    if (!result.getLeft()) {
     
    	// 验签失败会直接返回错误码
        Object error = SoulResultWrap.error(SoulResultEnum.SIGN_IS_NOT_PASS.getCode(), result.getRight(), null);
        return WebFluxResultUtils.result(exchange, error);
    }
    // 验签成功则放行请求
    return chain.execute(exchange);
}

你可能感兴趣的:(Soul,网关源码)