PERMISSION_MISMATCH
-
描述:调用接口返回 403,编码为
PERMISSION_MISMATCH
,没有该权限。 -
原因:
iam_permission
或 缓存中没有对应的权限 -
解决步骤:
1.通过[缺失权限管理]功能查看MISMATCH的权限信息,再对比实际请求的API,看是否有问题
2.首先检查接口调用是否正确,与请求的API是否匹配
3.检查Redis (db4 > gateway > permissions) 中是否有这个权限
4.再检查 iam_permission 中是否有这个权限(注意有层级之分)
5.如果 iam_permission 中或Redis中没有权限,调用 [hzero-iam > Tool Permission] 下的 [POST /v1/tool/permission/fresh] 接口手动刷新服务权限。也可在 [开发管理>系统工具] 下使用刷新权限的功能刷新。
6.上述方式都不行,如果是依赖的 hzero 服务,检查是否是版本用错了,有些服务区分 saas 版本和op版本,op 版本是不包含平台级接口的。
7.如果是自己开发的服务,检查 Controller 接口上是否有 @Permission 和 @ApiOperation 注解
8.检查网关服务是否配置了 redis.database=4,权限缓存到 db4 下;检查连接的 redis 地址是否正确。
刷新权限 403
- 描述:调用刷新权限的接口返回 403,编码为
PERMISSION_MISMATCH
,没有该权限。 - 原因:检查
iam_permission
表是否没有任何数据。正常情况下 IAM 服务启动后,会自动刷新自身的权限,只要用户登录后,就可以调用刷新权限的接口。 没有自动刷新权限的原因可能有三种:1. ADMIN服务未监听到服务注册事件(ADMIN服务不可用) 2. ADMIN服务无法访问IAM服务接口(网络原因或IAM服务不可用)3. ADMIN服务在IAM服务启动成功前启动,导致通知IAM刷新权限失败
PERMISSION_NOT_PASS
- 描述:调用接口返回 403,编码为
PERMISSION_NOT_PASS
- 原因:当前用户没有接口权限,可能是权限集中没有维护该权限,或者用户的角色没有分配到相应的权限集
- 解决:
- 首先在
菜单配置>权限集>权限
下,检查是否有该权限(或LOV),其次在角色管理>分配权限
里检查当前角色是否已分配了该权限集。注意以上操作本身是需要管理员权限的。 - 可通过[缺失权限管理]功能查看NOT_PASS的权限信息,可查看API的详细信息,对比实际请求的API、权限编码等确认API是否正确。
- 首先在
PERMISSION_SERVICE_ROUTE
-
描述:路由存在,但无法访问,调用API返回
PERMISSION_SERVICE_ROUTE
-
原因分析:
- 手动在数据库维护路由但未通知网关刷新路由
- ADMIN服务不可用(由于路由信息来源是ADMIN服务)
正常情况下,服务启动后,
hzero-admin
中会自动创建服务路由,并通知hzero-gateway
拉取最新的服务路由列表。
-
解决方案:
- 确保 admin 服务正常运行,可重启 admin 服务或 gateway 服务再测试。
- 检查自己部署的服务是否可访问,先检查注册中心上服务是否注册成功;其次在服务器上检查 IP+端口 是否可访问,可使用
telnet ip port
测试。 - 如果
hadm_service_route
中不存在相关路由,可在平台治理>服务管理
页面维护,不要直接在数据库添加。
服务API调用 405
-
描述:服务部署正常,API调用返回
no content
,控制台显示 405 错误 -
解决:405 是服务不可访问,有可能是调用接口方法(method)不正确、服务器本身设置不可访问某些方法,或者网关地址、服务地址不正确。 可以发现这里是API调用地址配置的网关域名没有端口号导致的。
No Jwt token in request(API)
-
描述:接口访问报
No Jwt token in request
错误 -
解决:
- 首先确保在服务启动类上加上了
@EnableChoerodonResourceServer
注解,该注解的主要功能是开启一个过滤器JwtTokenFilter
,解析 JwtToken,得到用户信息,因此可以在程序中通过DetailsHelper.getUserDetails()
得到当前访问的用户信息。同时,该过滤器默认对/v1/*
接口生效,如果其它前缀的路由也需要用户信息,需手动配置。 - 只有非public的接口以及匹配的资源请求才会被 JwtTokenFilter 拦截,并将 JwtToken 解析成 UserDetails,才能在服务中获取到登录用户信息。确认
@Permission
注解是否设置了 public 属性。
- 首先确保在服务启动类上加上了
No Jwt token in request(Feign)
-
描述:服务提供者和调用者服务都正常,单独调用服务接口也正常,但通过
Feign
调用返回401,报No Jwt token in request
错误。 -
解决:检查 pom 中是否引入了
hzero-starter-feign-replay
<dependency> <groupId>org.hzero</groupId> <artifactId>hzero-starter-feign-replay</artifactId> </dependency>
-
原因分析:此 jar 包中的
JwtRequestInterceptor
会自动拦截feign请求,为 RequestTemplate 加上 oauth token 请求头,被调用方即可解析出token。 -
扩展:在服务启动类上,一般都会加上
@EnableChoerodonResourceServer
注解,该注解的主要功能是开启一个过滤器JwtTokenFilter
,解析 Jwt_Token,得到用户信息,因此可以在程序中通过DetailsHelper.getUserDetails()
得到当前访问的用户信息。同时,该过滤器默认对/v1/*
接口生效,如果其它前缀的路由也需要用户信息,需手动配置。