夜莺二次开发指南-用户资源中心
前言
本系列将对夜莺平台各个模块的主要逻辑进行介绍,方便大家进行二次开发,本篇是系列的第四篇,用户资源中心模块
首先贴下夜莺的项目地址和架构图,正在使用夜莺的读者欢迎给夜莺加一个star
- github地址 https://github.com/didi/nightingale
- v3.0架构图如下
本节主要讲解用户资源中心的RDB模块,RDB模块是夜莺平台的基座,提供了用户信息、组织资源树、用户权限等功能,这些功能的实现都比较简单,大家可以直接看 http/router.go 的代码 ,里面列举了 rdb 的所有 http 接口,本篇主要介绍下第三方系统如何来接入夜莺平台
用户认证接入
夜莺提供了一套完整的用户体系,其他系统可以通过接入夜莺的用户认证来复用夜莺的用户体系。下面介绍一下接入用户认证的流程
- 首先待接入系统 A 和夜莺平台的 cookie 要可以复用
- 当用户在夜莺平台登录之后,会把和用户相关的 sessionId 写入到 cookie 中,当用户再访问接入系统 A 时,系统A从 cookie里可以拿到 sessionId,cookie 的 key 为 ecmc-sid
- 通过调研 rdb 提供的接口,查询用户的用户名,如果能查询说明用户是合法的而且已经登录了,如果查不到则说明用户没有登陆,可以让前端将页面跳转到夜莺的登陆页面
根据 sessionId 查询用户信息的接口如下
v1.GET("/sessions/:sid", v1SessionGet) //查询用户名
v1.GET("/sessions/:sid/user", v1SessionGetUser) //查询用户信息
关于用户信息这里展开说一下,首先看下用户的数据结构
type User struct {
Id int64 `json:"id"`
UUID string `json:"uuid" xorm:"'uuid'"`
Username string `json:"username"`
Organization string `json:"organization"`
IsRoot int `json:"is_root"`
LeaderId int64 `json:"leader_id"`
LeaderName string `json:"leader_name"`
//...
}
User 数据结构中提供了一个 LeaderId 字段,可以设置用户 leader 是谁,这样就具备了简单的企业组织结构的表达能力,在一些审批和升级事件中可以使用这个字段,User 数据结构中还有一个 Organization 字段,所以可以根据 LeaderId 和 Organization 绘制出公司的人员组织结构,大家有需要可以自己实现这个功能。
资源接入
夜莺使用组织资源树的方式来管理资源,夜莺平台的用户权限、告警策略、采集策略都是基于组织资源树来设计的。夜莺的目标是成为基础架构平台底座,让大家可以基于夜莺开发适合公司自己的基础平台。所以为了可以让各种PAAS类平台接入到夜莺平台,我们抽象了租户和项目两个特殊的节点类别。简单的节点组织方式可以为:租户—>项目—>模块,复杂一点的可以是:租户—>组织—>项目—>模块—>集群。
下面介绍下,第三方系统如何把资源自动注册到夜莺平台,夜莺提供了专门的资源注册和销毁的接口
// RDB作为一个类似CMDB的东西,接收各个子系统注册过来的资源,其他资源都是依托于项目创建的,RDB会根据nid自动挂载资源到相应节点
v1.POST("/resources/register", v1ResourcesRegisterPost)
// 资源销毁的时候,需要从库里清掉,同时需要把节点挂载关系也删除,一个资源可能挂载在多个节点,都要统统干掉
v1.POST("/resources/unregister", v1ResourcesUnregisterPost)
拿 RDS 平台接入夜莺举例,RDS 平台需要把用户创建的 RDS 实例和夜莺的项目节点绑定起来,夜莺提供了 /tree/projs 的接口,只展示用户拥有权限的项目节点,RDS 平台的前端页面可以调用这个接口,在用户创建 RDS 实例时,先让用户选择项目节点,这样就可以把实例和项目节点关联起来,等实例创建好之后,RDS 平台可以调用夜莺的资源注册接口,把RDS资源注册到夜莺的服务树上面。下面是rds注册到 rdb 之后的截图
通过这种方式,RDS 平台可以直接复用夜莺的权限管理能力和告警监控能力,将 RDS 实例的英文标识作为 endpoint 上报监控到夜莺之后,可以直接在夜莺平台查看监控和配置告警。
权限接入
通过上文RDS平台将资源绑定到节点之后,就可以复用夜莺的权限管理体系了,夜莺提供了两类页面,一类是页面角色,一类是资源角色。
如果系统有些页面或者按钮只可以给管理员看到,不能让普通用户看到,这个时候可以使用页面角色来配置权限
资源角色在涉及到某些资源相关的操作权限时使用,首先资源角色在配置的时候,需要框定一个范围,这个范围就是服务节点,也就是上文提到的项目节点,通过在某个项目节点给某个用户赋予某个角色,来控制该用户是否有权限来对RDS资源进行操作。
下面介绍下集成步骤
- 待接入的平台要梳理自己的业务,看哪些页面/操作需要受权限管控,每个页面/操作用一个权限点表示(底层实现是一个字符串,比如 rds_instance_write 表示RDS平台对项目下资源的写操作权限)
- 将梳理好的权限点,添加到 rdb 的配置文件lop.yml 和 gop.yml 中
- 根据平台的使用场景,创建相关的角色并配置好权限点
- 当用户在接入的平台操作时,比如在某个项目下创建rds实例,可以根据项目id+用户名+权限点调用 rdb的权限校验接口,来校验用户是否有权限做此操作,查询样例如下
curl -H "X-Srv-Token: rdb-builtin-token" 'http://rdb.addr:8000/v1/rdb/can-do-node-op?nid=1&username=root&op=rdb_perm_grant'
{"dat":true,"err":""}
本篇文章到此就结束了,下篇将为大家介绍资产管理平台(AMS)模块
- 原文作者:秦叶宁
- 原文链接:http://www.qinyening.com/post/2020-12-24-n9e-dev4/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。