接口匿名访问对外暴露

现象

未授权访问问题

如果微服务接入了资源服务器,那么所有的资源都会被 Spring Security OAuth 拦截,如果没有合法的 token,请求会被直接拒绝。

需求:访问目标接口不需要提供 token 即可匿名访问。如下图所示,会提示以下错误:

未授权访问错误示例

服务暴露

方法一、@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 表达式即可
配置文件示例

特别关注:暴露的接口无法获取用户信息

用户信息获取限制

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

特别关注:接口设置为公开,但携带错误 token 时被拦截

现象:

@Inner(false)  // 设置为公开
@GetMapping("/public/data")
public String getData() {
    return "public data";
}

访问时:

  • 不带 token → ✅ 正常访问
  • 带错误 token → ❌ 被拦截

原因:

Spring Security 默认会验证请求中的 token,即使接口是公开的。

解决方案:

如果需要完全忽略 token 验证,可以关闭 Spring Security 的这个行为:

配置示例