概要

联通最近开源的元景万悟作为央企首个开源的智能体开发平台,支持多租户、license友好并且基于golang开发,基于源码分析用户权限及功能权限的实现思路。

平台源码网址:

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

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

用户权限解析

元景万悟平台的多租户架构由组织、角色、用户组成。在页面的系统设置中创建组织通过开发者人员工具发现调用了如下接口。internal/bff-service/server/http/handler/router/v1/permission.go源码中在新的组织下有角色管理的权限角色创建时同步赋予功能权限

基于新的角色创建用户

登录用户daxin2,可以从permission接口看到返回的当前用户所有的权限,和选择的角色权限是一致的

此时我们可以梳理元景万悟智能体开发平台中组织角色用户之间的关系:

用户权限小结:

1、系统(顶级组织)下可以创建下级组织。

2、下级组织能够创建带有一定权限的角色。

3、下级组织能够创建用户并给用户赋予具体的角色,此时用户拥有指定角色的权限。

4、可以通过管理角色的权限对所有被赋予此角色的用户进行权限的管理。

功能权限解析

通过分析创建角色时,角色的权限选择是通过如下接口返回的页面展示的模型管理、知识库等权限是通过permission接口返回的用户权限来进行展示的,通过扒代码我们可以发现,上述template和permission接口的权限返回就锁定了页面功能权限的范围,那么如果此时开发者想二次开发,新增一个功能的话,功能的权限应该如何下手呢?

这两个接口都调用了internal/bff-service/service/common.go中的GetUserPermission方法:其他子用户的权限都是根据admin账户的权限进行下发的,那么我们需要找到admin权限是如何定义的,从哪里来的。

发现权限从mid.CollectPerms()这个方法中返回,如果是admin则直接从该方法的返回append到ret中

继续扒代码发现权限是从HTTP服务进行初始化时,初始化了中间件,其中wrapper就带着权限信息了

internal/bff-service/server/http/middleware/init.go中对权限进行了定义

此时初始化中定义了权限,下面详细分析其各参数的含义:

tag:model,定义权限的标签,作为在权限传递时的校验,具有唯一性。

权限name:模型管理,定义权限名称,作为传递给前端时作页面展示。

权限级别:PermNeedCheck,有三级权限PermNone=0、PermNeedEnable=1、PermNeedCheck=2,这三个权限分别对应:不需要校验、需要校验是否登录、需要校验是否具体权限。

是否显示导航栏:true,用于确保父子权限的统一性,比如父权限如果隐藏菜单,子权限也需要隐藏。

是否需要权限校验:true,用于确保父子权限统一并且保证如果是true,权限级别是PermNeedCheck。

jwt相关校验方法:JWTUser,验证调用请求的jwt是否有效并无感刷新。

校验用户调用权限方法:CheckUserPerm,有两种CheckUserEnable、CheckUserPerm,前者通过方法校验用户是否登录,后者校验用户是否具有该权限。

子权限:比如上述permission权限下分别还有user、org、role,注意参数需要与父权限统一。

那么在这里如果定义了功能权限,具体的实现怎么和开发者自己写的方法绑定呢?

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

这段配置通过中间件初始化时定义的权限标签(Tag)与API路径进行绑定,并在Nginx层完成路由分发。开发者可通过以下步骤实现功能扩展:

添加自定义方法:在对应模块(如v1)中实现新的业务逻辑。

绑定权限标签:通过mid.Sub("权限分类").Reg()关联权限与路由。

配置Nginx路由:在代理规则中指定新接口的路径,确保请求正确转发。

功能权限小结:

从页面权限返回切入进行分析,梳理了元景万悟的功能权限从定义、传递、绑定到具体方法实现的过程。明确了下面几个要点:

1、权限定义时涉及到的参数含义及定义原则

2、不同用户其功能权限的来源和绑定原则

3、新增功能时其权限的实现逻辑

总结

通过从页面到源码的分析,梳理了元景万悟智能体开发平台的用户、角色、组织的多租户架构;功能权限与角色用户是如何绑定的以及功能权限的定义原则。基于此,清晰了开发者对元景万悟平台进行二次开发时对于用户、功能权限的实现逻辑。

Logo

更多推荐