📄 接口直接对外暴露
内部资料,请刷新扫码登录
pigcloud
# 现象
如果微服务接入了资源服务器,那么所有的资源都会被 spring security oauth 拦截,如果没有合法的 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 表达式即可
# 3. 暴露的接口无法获取用户信息
如果通过以上两种方式将接口设置为对外暴露(使用 @Inner 注解或配置文件形式),则当前接口下游的所有逻辑都 无法获取当前用户(SecurityUtils.getUser() === null)。