接口直接对外暴露

pclin
7
2025-01-09

现象

如果微服务接入了资源服务器,那么所有的资源都会被 spring security oauth 拦截,如果没有合法的 token,请求会被直接拒绝。如下图所示,会提示以下错误:

1657673835

#服务暴露

#方法一、 @Inner 注解

// 如果配置在 controller 类上,则整个类的接口都会对外暴露
@Inner(value = false)
@GetMapping("/")
public R api() {
}

特别说明:@Inner 注解作用于 Path Variable 风格的请求时需要特别注意,如下图中的 /{id} 会被识别为 /*,从而自动配置到 spring security 接口。这会导致其他接口虽然没有加 @Inner 注解,但也会对外暴露并且无法获取用户信息(如下图 ① 所示,已经暴露,并且也会造成 ② 接口对外暴露)。

  • 慎用 Path Variable 请求加 @Inner 注解。

  • 如果要使用,请确保将路径写得更长一些,并且检查 /XX/XX/* 是否会影响其他接口。

#方法二、 nacos 配置如下属性

如果封装的接口(例如 swagger 等)不能加 @Inner 注解,可以参考下文中的配置文件声明。

nacos/微服务对应的配置文件

security:
  oauth2:
    client:
      # 默认放行的 url,如果子模块重写了这里的配置,会被覆盖
      ignore-urls:
        - /actuator/**
        - /v2/api-docs
        - 目标接口的 Ant 表达式即可

#3. 暴露的接口无法获取用户信息

如果通过以上两种方式将接口设置为对外暴露(使用 @Inner 注解或配置文件形式),则当前接口下游的所有逻辑都 无法获取当前用户(SecurityUtils.getUser() === null)。

动物装饰