权限系统设计

news2024/10/6 8:28:37

背景

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

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

缺点:

提议二、

。。。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学计算机的可以做哪些适合自己的兼职?

如果你在做以下的任意一种兼职,我建议你立刻停止! 1.单纯体力劳动的兼职 像是发传单、发问卷、送外卖这类兼职只能在短期内提升你的“8小时外收入”的兼职,纯粹是靠时间和体力来换钱,性价比很低,而且不能通过兼职提升…

指定字符串中的一部分将原来的字符串拆分成三部分partition()函数

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 指定字符串中的一部分 将原来的字符串拆分成三部分 partition()函数 选择题 对于以下python代码表述错误的一项是? Str"12345" print("【显示】Str",Str) print("…

Vue2【前端路由的概念与原理、vue-router 的基本用法、vue-router 的常见用法、后台管理案例】

文章目录前端路由的概念与原理1. 什么是路由3. SPA 与前端路由4. 什么是前端路由5. 前端路由的工作方式6. 实现简易的前端路由步骤1&#xff1a;通过 **\<component\>** 标签&#xff0c;结合 **comName** 动态渲染组件。示例代码如下&#xff1a;步骤2&#xff1a;在 Ap…

Xcode Cloud

一、使用Xcode Cloud 的要求 &#xff08;1&#xff09;开发者账户要求 已加入Apple Developer Program向xcode加入Apple IDApp Store Connect上有app 记录或者可以创建一个app记录 &#xff08;2&#xff09;Project和workspace要求 Project或者workspace使用Xcode项目使用…

JavaScript基础语法

JavaScript基础语法 文章目录JavaScript基础语法1.JavaScript的基本认知1.1 JS的介绍与组成1.2 JS代码使用格式2.JavaScript的注释与输入输出语句2.1 JS的注释方法2.2 JS的输入输出语句3.JavaScript的变量3.1 JS的变量初始化3.2 JS的声明变量特殊情况3.3 JS的变量命名规则4.Jav…

Windows版本Anaconda安装教程

1、点击安装包&#xff0c;右键-以管理员身份运行安装文件&#xff0c;如图所示&#xff1a; 2、直接点击next即可 3、接着进入到许可协议的界面&#xff0c;这里点击I agree选项&#xff0c;也就是我同意的意思。 4、接着进入到用户选择的界面&#xff0c;选择all users选项&a…

面试官的灵魂质问—什么是转发与重定向

文章目录 文章目录文章目录[toc]一、什么是HttpServletRequest、HttpServletReSponse&#xff1f;二、Servlet中HttpServletRequest[源码](https://so.csdn.net/so/search?q源码&spm1001.2101.3001.7020)分析获取客户端传递的参数请求转发三、Servlet中HttpServletReSpons…

HTML网页设计结课作业——基于HTML+CSS仿学校官网页面

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【保姆级】新机器部署Nacos

1、登录服务器&#xff0c;如果非root用户则切root用户 sudo su - 2、在/usr/tmp目录上传nacos安装包 3、将安装包移到/usr/local/目录 mv nacos-server-2.0.3.tar.gz /usr/local/ 4、解压 tar -zxvf nacos-server-2.0.3.tar.gz 5、创建nacos数据库&#xff0c;执行官网SQL建…

vc中调用matlab生成的动态库

开发环境&#xff1a; vs2010 matlab r2016a 步骤一&#xff1a;matlab中生成动态库 创建文本文件 D:\matlabTest\myadd.m&#xff0c;文件内容参看下面代码部分。注意&#xff1a;如果把myadd.m文件直接放在d盘根目录下&#xff0c;matlab中编译生成动态库时&#xff0c;会…

JavaScript--跟随pink老师视频学习版 (2022)

JavaScript一、JavaScript简介1.什么是JavaScript2.JavaScript用途3.浏览器执行JavaScript简介3.JavaScript组成1.ECMAScript2.DOM3.BOM4.JavaScript代码位置1.行内2.内嵌3.外部引入5.JavaScript输入输出语句二、JavaScript变量1.什么是变量2.变量使用3.变量命名规范三、数据类…

DBCO-NH2,DBCO-Amine 实验室 杂氮二苯并环辛炔-胺 1255942-06-3

DBCO(二苯并环辛炔) 的羧基和琥珀酰亚胺酯衍生物&#xff0c;可与带有胺基的生化小分子形成稳定的酰胺键连接。 胺官能团的环辛炔衍生物。环辛炔可用于菌株促进的无铜叠氮化物-炔烃环加成反应。该二苯并环辛炔可在不需要Cu&#xff08;I&#xff09;催化剂的情况下&#xff0c…

TCP/IP网络编程(10) IO函数

在Linux下&#xff0c;一般使用read & write函数完成数据IO&#xff0c;因为Linux下的套接字&#xff0c;可视为文件&#xff0c;其操作方式与文件类似&#xff0c;当套接字分配之后&#xff0c;会为其分配对应的文件描述符。在Windows下&#xff0c;则需要使用recv & …

[oeasy]python0016_编码_encode_编号_字节_计算机

编码(encode) 回忆上次内容 上次找到了字符和字节状态之间的映射对应关系 字符对应着二进制字节二进制字节也对应着字符 这种字节状态是用2位16进制数来表示的hex(n)可以把数字转化为 ​​16进制​​字符串 hexadecimal bin(n)可以把数字转化为 ​​2进制​​字符串 integer …

显示控件——AV输入显示

通过修改变量地址打开或者关闭AV显示&#xff0c;需要硬件支持。 位置信息&#xff1a;控件在工程页面区域的位置 “X”“Y”为控件区域左上角坐标。 “W”“H”为控件区域宽度和高度&#xff0c;单位为像素点。 名称&#xff1a;默认为AVInputView,可以重新设置。 叙述指针…

生产制造管理系统对中小型企业的作用有哪些?

随着企业数字化转型的概念深入人心&#xff0c;传统生产制造企业也渐渐重视起来了。对于资金雄厚的大型生产制造企业而言&#xff0c;企业数字化转型还是比较可以快速适用并且付出行动。而对于很多的中小型企业而言&#xff0c;对于企业数字化转型则没那么重视&#xff0c;甚至…

Beam failure Recovery

微信同步更新欢迎关注同名modem协议笔记 这篇来看BFR 过程&#xff0c;这里把38.300中对于BFD和BFR流程的描述再贴一遍。 BFD 发生在Pcell时: UE 通过在Pcell上进行RA 过程来触发BFR&#xff1b;UE 要选择suitable beam去进行BFR&#xff08;如果gNB 配置了某些beams 的dedica…

NodeJs实战-待办列表(2)-待办列表增删

NodeJs实战-待办列表-增删改查项目结构增加表单提交事件修改 index.htmlNodeJS 服务端增删改查修改 server.js效果图初始页面输入 1111&#xff0c;点击添加输入 1111 点击完成项目结构 增加表单提交事件 修改 index.html 引入 jquery <script type"text/javascript…

对抗生成网络GAN系列——f-AnoGAN原理及缺陷检测实战

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

[iOS- Mac终端上传Git and 生成Token]

前言 我先写了如何上传的每一步&#xff0c;都有截图&#xff0c;在文章的后面写了出现的问题&#xff0c;即网上找到的解决方法&#xff01;&#xff01;&#xff01;谨以此篇博客纪念我忙了一个晚上的麻烦 累死个人 首先要配置好git 这里不多说了Mac上传Git 搞了我一下午晚…