权限系统设计
创始人
2024-01-29 12:47:25

背景

目前只做了用户账号间的数据隔离。存在情况,同一个项目里不同人创建不同的资源,项目里的成员都可以看得到,同时也不能互相随便修改数据。所以需要一些组的权限控制。

1.模型和模型荚是公用的,没有做用户区分,也没有做项目区分。(需要创建是用户id存进去, 同时查询用户所在的项目也存进去。)

2.策略按用户区分,也没有做项目区分。 ( 查询用户所在的项目存进去)

3.其他都是按用户id来查询,做数据隔离。

需求

系统管理员:能crud所有数据

项目管理员:能cru自己项目下的所有数据

项目成员:能cu自己项目下的本人的数据。r项目下的所有数据。

group:他在哪个组(这里在里面就是项目 app, 有个特殊的,超级管理员组,能做所有事情)

role:角色是什么(超级管理员,项目管理员,项目成员)

resource:能对什么资源(node,app,policy, user)

action:做什么(crud)

系统设计

新增表:

user/ group_member

_id

自增id

appId

项目组

int

项目id

role

角色

int

1 项目管理员 2 项目成员

resource

资源

[]string

["node", "policy", "app", "model","node_config"]

action

动作

[]struct{}

[

{

"res":"node",

"act":["create","read","update","delete"]

},

{

"res":"app",

"act":["r"]

}

。。。。。。

]

c:create

r:read

u:update

d: delete

一个项目管理员的权限

userId

用户id

int64

admin

超级管理员

uint8

1 超级管理员 0不是

如果是1,则不受权限控制

appName

项目名字

string

ct

upt

d

dt

注1:一个用户可以在多个项目里面,在每个项目有对应的一个权限。如果一个用户在多个项目里面,那么他创建的资源,会在多个项目里面被看到(如果有对应项目的权限的话)。

注2:模型和模型荚比较特殊,公用的,都能看见,但是只能超级管理员编辑。

新增接口

1.创建权限组接口 -> 创建app接口

2.创建成员并分配权限

post /api/v1/user/group/member

json

字段

类型

含义

是否必须传

admin

uint8

1 是 0 否

否。如果是admin,那么下面的都可以不传,除了userId。

只有sysAdmin能分配admin

appId

int64

1234

role

uint8

1 项目管理员 2 项目成员

userId

int64

int64

resources

[]string

["node", "policy", "app", "model","node_config"]

action

[]struct

[

{

"res":"node",

"act":["create","read","update","delete"]

},

{

"res":"app",

"act":["r"]

}

。。。。。。

]

3.修改成员所属组

put /api/v1/user/group/member/app

json

字段

类型

含义

是否必须传

userId

appId

旧的app

newAppId

新的app

role

否,不传会用之前的

resource

新的资源

否,不传会用之前的

action

同上表

新的act

否,不传会用之前的

4.修改成员所在组的角色

put /api/v1/user/group/member/role

sysAdmin和appAdmin都可以

字段

类型

含义

是否必须传

admin

userId

appId

所在组

resource

新的资源

action

新的act

role

同上表

角色

5.获取用户权限组信息

Get /api/v1/user/group/one_member

有权限组的都可以看。

form-data

字段

类型

含义

是否必须传

user_id

否,不传就是查看当前用户的,传就是查看其他用户或者自己

 

{ "code":0, "msg":"success", "data":{ "admin":0, "list":[ { "appId":1, "resources":[ "node", "node_config" ], "action":[ { "res":"node", "act":[ "create", "read", "update", "delete" ] } ], "role":1 } ] } }

例子:一个比较复杂的情况

存在一个用户有多个组的情况,去拉取一个node列表,node列表会返回他所在的app(多个?一个),前端需要判断当前编辑的node所在的app, 是否在用户的组内,并且有u权限。

注1:node比较特殊,需要选择所在的app,所以只有node存在app唯一的情况。

其他的资源,可以存在多个app的情况(除了model,node_config, 其余取决于创建用户所在的组)。

新增code码对应权限错误

code=10006 无权限

系统流程

 

详细设计

1.无权限组的,直接返回失败。

2.只有超级管理员可以操作group_member系列api

项目管理员可以操作自己项目组的人员权限

1.create

1.新增app,model,node_config->如果是超级管理员成功,其他失败

2.新增node->如果是自己所在项目下的->成功。

3.新增策略(规则在策略下)->如果是自己所在项目组的app->成功

4.新增系统管理员,如果是sysAdmin 成功, 否则失败

新增项目管理员,sysAdmin和appAdmin 都可以新增该项目的管理员和成员

2.read

1.app,node,policy -> 超级管理员看到所有的,其它的看到自己所在组的->成功

2.model, node_config->看到所有的->成功

3.->超级管理员看到所有的,其它的看到自己所在组的->成功

4.->超级管理员看到所有的,其它的看到自己所在组的->成功

5.系统管理员可以看到所有的。 其他的只能看到自己项目组的

3.update

1.app 无

2.node,policy->admin所有,app_admin自己项目下的,app_member自己项目下的自己创建的

3.model,node_config ->admin所有的,其它的失败。

4.policy->admin所有,app_admin自己项目下的,app_member自己项目下的自己创建的

5.sysadmin可以修改所有的,但是appAdmin只能修改自己本组的。其他失败

4.delete

1. app 无

2.node 无

3.model, node_config无

4.policy->admin所有,app_admin自己项目下的,app_member自己项目下的自己创建的

5.sysAdmin delete所有,appAdmin只能删除自己项目组的,其它失败

接口

背景

为什么要改接口名字?

1.目前接口名字不直观,要分析整个path和method才大概清楚知道这个接口在做什么

2.在后端middleware想要对某一个特殊路由做特殊处理,不好判断,参数在path上,不好统一处理。

3.参数比较复杂的情况下,要解析path,query,body 3个地方。

提议一

http method 使用get和post

get: 所有参数放到query

post:参数放到body,公参放到query

比如公参sign

api/版本/resource/sub_resource.../action/辅助理解词

1.比如获取一个node :

/api/v1/node/get/by_node_id?sign="211"&appId=1211&node_id=1234

2.更新一个node的模型荚数据:

/api/v1/node/update/node_config_data?sign="dadadaf"

{node_id:12121....}

3.删除一个node:

/api/v1/node/delete/one?sign="dadadaf"

{node_id:12121....}

4.创建一个node

/api/v1/node/create?sign="dadadaf"

{nodedata}

优点:

1.直接看到接口的含义

2.方便后端在middleware统一判断权限。

3.可以在middleware对特定的接口做处理

4.方便参数解析,打印tracelog

缺点:

提议二、

。。。。。。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
平遥古城在哪 平遥古城基本现状 城垣恢宏,雉堞连云市井街巷,店肆林立四合院落,青砖瓦屋这里是平遥古城历经千年沧桑而古朴宛然,风姿依旧...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
平遥古城在哪 平遥古城基本现状 城垣恢宏,雉堞连云市井街巷,店肆林立四合院落,青砖瓦屋这里是平遥古城历经千年沧桑而古朴宛然,风姿依旧...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...