概要

联通最近开源的元景万悟作为央企首个开源的智能体开发平台,支持多租户、license友好并且基于golang开发,分析多租户系统组织、角色、用户实现。

平台源码网址:

https://github.com/UnicomAI/wanwu.git

基于Readme中一键部署,拉取镜像。

(1)实现创建、编辑、删除组织及其角色、用户影响

在上一篇文章中分析了万悟平台的多租户设计的思路,接下来分析组织的操作与角色用户之间的实现关系。

在页面上创建组织会定位到这个接口

internal/bff-service/server/http/handler/router/v1/permission.go

具体传入参数只有name和remark,并获取了当前用户id和组织id

bff的service层只做了方法的调用和参数透传,具体看微服务层的实现

在iam-service的client端实现中,实现有createOrgTx方法

根据当前用户id和组织id判断是否是创建系统组织,如果创建非系统组织,校验组织表和用户表中上级组织和创建人是否还存在,并且更新角色表中的roleName为组织管理员

如果创建系统组织,校验组织表中是否存在组织,并且更新角色表中的roleName为超级管理员

在通过校验及确定roleName之后再进行数据库创建操作,其中创建组织之后,创建带有组织相关信息的角色信息,如果是普通用户创建还会更新OrgUser表和UserRole表

编辑组织只对组织的名字和描述进行修改,但会对是否是所编辑组织的父组织、所编辑组织名在父组织创建的子组织中是否重复进行校验,校验通过之后执行数据库更新操作。

删除组织则是通过所传组织ID进行删除操作,因为组织ID是全局唯一的。在删除的流程中会先校验是否是顶级组织,顶级组织无法被删除;获取系统的组织树;通过删除组织id和和组织树进一步进行关联表的删除。

首先递归删除子组织,每个递归中会对UserRole、OrgUser、OrgRole、Role表进行对应组织ID的删除,最后对Org表进行删除。

(2)实现创建、编辑、删除角色及其组织、用户影响

角色操作的相关接口在bff中的接口设计如下:

在swagger这里对创建角色加了校验,如果不是当前组织的组织管理员角色是不能进行角色的创建的。

创建角色时,因为系统设计在系统组织下是没有角色相关的操作功能的,所以需要先进行当前组织用户操作权限的校验,如果当前组织用户也没有某个权限,那么创建的角色也应该没有该权限,校验通过后再进行iam服务创建角色的调用。

在iam服务中,经过基本的组织是否存在校验之后,校验角色名是否重复,调用access.RBAC0CreateRole包中的方法创建角色,如果成功,继续创建组织角色表,保存组织角色关系。

编辑角色时,会在校验之后同步更新另外几个关联表。并且禁止修改组织管理员权限。并在更新角色信息之后,更新角色的权限。

删除角色时,先校验组织角色表,是否存在待删除的角色,接着校验组织内置管理员角色,此角色不能通过删除角色删除,接着删除用户角色表、组织角色表、角色表。

(3)实现创建、编辑、删除用户及其组织、角色影响

用户操作的相关接口在bff中的接口设计如下:

用户创建时同样在bff层做了非管理员不能创建的校验。

从代码分析,先校验创建用户的组织是否存在,如果创建用户时赋予了角色继续分析组织角色表中是否存在对应角色,存在就记录下来。接着校验创建用户的父用户是否存在并且不为系统管理员,校验用户名、电话是否重复,并且加密密码,继续创建用户表,在创建组织用户表时,同步加入系统组织关系表里,再根据角色信息创建用户角色表数据。

编辑用户同样在bff层限制非组织管理员无法调用,在更新用户相关信息之前需要进行校验。首先校验用户的状态,再查询用户的角色更新信息,继续进行基本信息的校验,并修改用户信息表,比较如果角色信息有变动则重新更新用户角色表。

删除用户则是分为系统下删除用户和组织内移除用户,两部操作的区别在于前者会更新user表,多了无法删除系统管理员校验,后者无法移除出系统组织,并没有删除用户表信息,只做了移除操作。

总结

对于万悟系统中用户、组织、角色,创建、编辑、删除的操作,会有相互影响,涉及到多个关联表的操作,基于此实现了万悟多租户系统的设计和实现。在此基础上,可以进一步扩展多租户系统下的权限隔离,实现应用层面的隔离等。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐