【水文】角色权限设计
参考
备注
本文章仅仅思考了简单的功能权限与数据权限的实现,建议具体参考上面的引用链接进行学习。
表结构定义
users、rules、roles 表实现功能权限管理(如果单用户支持多角色,就需要配合 user_join_roles 表)
users、departments、jobs、rule_job_auths 表实现数据权限管理(如果单用户支持多职务,就需要配合 user_join_jobs 表)
- users 用户表
字段名 | 类型 | 注释 |
---|---|---|
id | int | ID |
name | varchar | 昵称 |
age | tinyint | 年龄 |
department_id | int | 所属部门ID |
job_id | int | 所属职务ID |
role_id | int | 所属角色ID |
address | varchar | 地址(涉及隐私,普通员工禁止查看) |
created_at | datetime | 创建时间 |
- departments 部门表
字段名 | 类型 | 注释 |
---|---|---|
id | int | ID |
name | varchar | 部门名称 |
department_id | int | 所属部门ID |
created_at | datetime | 创建时间 |
- jobs 职务表
字段名 | 类型 | 注释 |
---|---|---|
id | int | ID |
department_id | int | 所属部门ID |
name | varchar | 职务名称 |
data_auth | tinyint | 数据权限(1.本人,2.本部门和本人,3.本部门、同级部门和本人),4.本部门、本人和本部门下所属部门,5. 本部门、本人、同级部门下属部门和本部门下所属部门,6.全部数据 |
created_at | datetime | 创建时间 |
- rules 功能权限规则表
字段名 | 类型 | 注释 |
---|---|---|
id | int | ID |
name | varchar | 规则名称 |
url | varchar | 接口地址 |
request_type | varchar | 请求类型 |
rule_id | int | 所属规则ID |
fields | varchar | 字段列表,可以设置表单内展示类型,编辑状态?字段名等信息的json格式说明(文末有json格式参考) |
created_at | datetime | 创建时间 |
- roles 功能权限角色表
字段名 | 类型 | 注释 |
---|---|---|
id | int | ID |
department_id | int | 所属部门ID |
job_id | int | 职务ID |
name | varchar | 角色名称 |
rule_ids | varchar | 规则ID列表 |
created_at | datetime | 创建时间 |
user_join_roles 用户关联功能权限角色表(如果支持多角色, 就需要这个表)
字段名 | 类型 | 注释 |
---|---|---|
id | int | ID |
user_id | int | 用户ID |
role_id | int | 角色ID |
created_at | datetime | 创建时间 |
user_join_jobss 用户关联职位表(如果支持多职务, 就需要这个表)
字段名 | 类型 | 注释 |
---|---|---|
id | int | ID |
user_id | int | 用户ID |
job_id | int | 职务ID |
created_at | datetime | 创建时间 |
- rule_job_auths 功能规则职务权限表
字段名 | 类型 | 注释 |
---|---|---|
id | int | ID |
rule_id | int | 功能规则ID |
job_id | int | 职务ID |
rules | varchar | 规则(储存json对象,其中包含当前url接口的字段列表、字段范围条件等,如:某个字段范围、大小等判定规则。有个问题就是字段如果不存在于表中就会报错,另外如果是多级子查询那么字段如何设置是否显示呢?) |
created_at | datetime | 创建时间 |
功能解释
权限: 功能权限、数据权限。
功能权限 (如RBAC)
根据接口去设置权限,如有一个用户接口,那么用户接口包含显示、增加、删除、
数据权限
数据范围:仅本人数据、本人所属部门数据、本人同级部门数据、本人所属部门与部门下属部门的数据、全部数据。
数据字段:HR能查看人员列表中包括职级、薪资等字段,其它角色仅能查看姓名邮箱等字段。
样例格式
表rules的字段fields 储存格式
[
{
"field": "id",
"showName": "ID",
"type" : "int"
},
{
"field": "users",
"type" : "array",
"values": [
{
"field": "id",
"showName": "ID",
"type" : "int"
},
{
"field": "name",
"showName": "用户名",
"type" : "string"
},
{
"field": "age",
"showName": "年龄",
"type" : "int"
}
]
}
]
表rule_job_auths的rules字段 储存格式
感觉字段权限类型有点绕的设计
json中的 changeInfo 与 jsFormatCode 可以做成注册插件的形式(或者单个类的方式,去自由扩展企业中多种多样的类型)
[
{
"field": "数据库字段",
"showName": "要在前台展示的名字",
"jsFormatCode": "前台展示字段的时候js格式化的代码",
"changeInfo": {
"changeStatus": false,
"changeContainerBox": "input|text|textarea|select",
"changeContainerType": "text|radio|checkbox|date|dateLimit",
"changeContainerOptionInfo": {
"source": "api|dictionary|null",
"value": "apiName|dictionaryKey|null"
}
},
"searchStatus": true,
"rules": [
{
"compare": ">=|<=|=|>|<|!=",
"values": "比较的值"
}
],
"fields": [
{
"field": "数据库字段",
"showName": "要在前台展示的名字",
"jsFormatCode": "前台展示字段的时候js格式化的代码",
"changeInfo": {
"changeStatus": false,
"changeContainerBox": "input|text|textarea|select",
"changeContainerType": "text|radio|checkbox",
"changeContainerOptionInfo": {
"source": "api|dictionary|date|null",
"value": "apiName|dictionaryKey|dateLimit|null"
}
},
"searchStatus": true,
"rules": [
{
"compare": ">=|<=|=|>|<|!=",
"values": "比较的值"
}
],
}
]
}
]
旧的设计
fields 属性说明
字段 | 说明 |
---|---|
field | 数据表字段 |
showName | 展示到前台的字段名 |
type | 字段的数据库类型 |
changeStatus | 是否可修改 |
changeContainerBox | 前端html标签容器名 |
changeContainerType | 前端html标签容器类型 |
fields | 关联查询的字段列表 |
rules 属性说明
字段 | 说明 |
---|---|
field | 数据表字段 |
compare | 规则 |
values | 规则比较的值 |
其中 json.fields 拉取 表rules的fields字段 中的数据,并选择可以显示的字段,当然可以尝试设置黑名单模式(黑名单模式就需要将部分字段转移到表rules中)。
json.rules 则是对数据进行区间设定。
{
"fields":[
{
"field": "id",
"showName": "ID",
"type" : "int",
"changeStatus": false,
"changeContainerBox": "input",
"changeContainerType": "text",
"changeContainerOptions": null,
"fields": null
},
{
"field": "users",
"type" : "array",
"changeStatus": null,
"changeContainerBox": null,
"changeContainerType": null,
"changeContainerOptions": null,
"fields": [
{
"field": "id",
"fieldType" : "int",
"showName": "ID",
"changeStatus": false,
"changeContainerBox": "input",
"changeContainerType": "text",
"changeContainerOptions": null,
"fields": null
},
{
"field": "name",
"showName": "用户名",
"type" : "string",
"changeStatus": true,
"changeContainerBox": "input",
"changeContainerType": "text",
"changeContainerOptions": null,
"fields": null
},
{
"field": "age",
"showName": "年龄",
"type" : "int",
"changeStatus": true,
"changeContainerBox": "input",
"changeContainerType": "number",
"changeContainerOptions": null,
"fields": null
},
{
"field": "sex",
"showName": "性别",
"type" : "int",
"changeStatus": true,
"changeContainerBox": "input",
"changeContainerType": "radio",
"changeContainerOptions": [
{
"showName": "男",
"value": "1"
},
{
"showName": "女",
"value": "2"
}
],
"fields": null
}
]
}
],
"rules": [
{
"field": "id",
"compare": "between",
"values": "100,1000"
},
{
"field": "users.age",
"compare": ">=",
"values": "35"
}
]
}
博 主 :夏秋初
地 址 :https://www.cnblogs.com/xiaqiuchu/p/17320153.html
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
地 址 :https://www.cnblogs.com/xiaqiuchu/p/17320153.html
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
2019-04-14 VIM常用快捷键