-
-
Notifications
You must be signed in to change notification settings - Fork 10.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Feat] Cluster Authorization By Env 支持按环境给用户授权集群管理权限 #5301
Comments
cc. @nobodyiam |
非常感谢提交 PR 增强 apollo 的权限管理能力!apollo 在初始设计时把权限绑定在了 namespace 上,粒度比较细,在某些场景下确实不太方便,用户需要做大量的权限配置工作。
其实未来在这个基础之上可以做更多扩展,例如:
这次 PR 要实现的是
按照上述的分析,对于修改方式我可能更倾向于修改 @PreAuthorize(value = "@permissionValidator.hasModifyNamespacePermission(#appId, #env, #clusterName, #namespaceName)") 可以考虑把 |
了解,这样所有权限的入口会相对唯一,复用度会更高。🙌 |
需求:
#4372
新用户按环境授权,无法直接作用于集群,只能作用于集群的namespace。
支持按环境给用户授权集群管理权限,如查看、更改和发布。
** 实际上集群就是跟着环境走的,集群 = App 在某个 Env 下的一种划分 **
现状
实际上,从Permission这张表里面可以看得到,对于一个应用(App)的对应权限有如下权限的划分
App 管理员
应用管理员具有以下权限: 1. 创建 Namespace 2. 创建Cluster 3. 管理App、Namespace 权限
App-Namespace 维度的Namespace管理员(分为两种权限)
App-Namespace-Env 维度的Namespace管理员 (分为两种权限)
方案:
Permission 侧:
新增两种
PermissionType
,ModifyCluster 和 ReleaseCluster。代表在Cluster维度的修改和发布的权利,即可以修改和发布Env-Cluster下所有Namespace。对应的
TargetId
格式为 AppId + Env + ClusterName。Role 侧:
新增
RoleName
:ModifyCluster+TargetId 和 ReleaseCluster+TargetIdManagement/Subjective
在Portal新增三个接口,获取、赋予、移除Cluster相关的权限Permission。
OpenApi处暂时没有支持相关管理能力。
Management/Passive
需要在Cluster被创建的时候进行RoleInitialize,Cluster在下面几个场景会被创建:
第一种创建默认的Cluster的场景,Portal是完全不感知的,只知道自己向对应Env发送了创建App的请求,创建Cluster的逻辑完全在AdminService端,只能在创建完远端App之后,默认Cluster也创建成功。
由于权限系统只存在于Portal,三条创建Cluster的链路在Portal端是没有交集的,完全不同,因此需要在三个地方都加上
initializeClusterRole
的逻辑。(以后或许是可以优化的点)Usage/Anno&Api
目前来说,Namespace的权限校验相关功能,现有的系统的调用链路还是比较统一的,比如说ModifyNamespace权限校验基本都是调用的
hasModifyNamespacePermission
这个接口。这对于要新加入的ModifyCluster权限就不太合适了,首先方法的语义就不相同,ModifyNamespace是ModifyCluster的子集。如果要在这个接口里面再做对Cluster权限的校验也不合适,因为参数列表里面没有传递ClusterName。
所以可以得到结论:要实现Cluster级别权限的需求,必定要在原有的代码上进行修改了,也就是这个注解:
目前来说有两种实现方式:
hasModifyClusterPermission
,在注解表达式中用or
加进去。两种方法其实都对原本代码是破坏性的,所以还是打算先选择第二种方法,**对原本的功能的影响尽可能的少。**如有需要,后续再对权限校验进行重构。
测试报告
后端集成测试
主要写了两个集成测试,从Usage和Management两个方面入手
ItemControllerAuthIntegrationTest
:测试是否有权限时,对需鉴权接口的访问情况PermissionControllerTest
:测试Cluster Role的管理端整个生命周期(初始化,assign,get,remove)整体Portal端验收测试
The text was updated successfully, but these errors were encountered: