【水文】角色权限设计

参考

备注

本文章仅仅思考了简单的功能权限与数据权限的实现,建议具体参考上面的引用链接进行学习。

表结构定义

users、rules、roles 表实现功能权限管理(如果单用户支持多角色,就需要配合 user_join_roles 表)
users、departments、jobs、rule_job_auths 表实现数据权限管理(如果单用户支持多职务,就需要配合 user_join_jobs 表)

  1. 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 创建时间
  1. departments 部门表
字段名 类型 注释
id int ID
name varchar 部门名称
department_id int 所属部门ID
created_at datetime 创建时间
  1. jobs 职务表
字段名 类型 注释
id int ID
department_id int 所属部门ID
name varchar 职务名称
data_auth tinyint 数据权限(1.本人,2.本部门和本人,3.本部门、同级部门和本人),4.本部门、本人和本部门下所属部门,5. 本部门、本人、同级部门下属部门和本部门下所属部门,6.全部数据
created_at datetime 创建时间
  1. rules 功能权限规则表
字段名 类型 注释
id int ID
name varchar 规则名称
url varchar 接口地址
request_type varchar 请求类型
unique_id varchar 接口唯一ID(unique_id与id好像冲突了,因为id就是唯一的)
rule_id int 所属规则ID
paramers varchar 字段权限?但是有些接口字段包含关联,所以字段需要再思考下,可以至设置子节点所属父节点的权限字段,子节点自动继承,就实现了字段权限的管理。
fields varchar 字段列表,可以设置表单内展示类型,编辑状态?字段名等信息的json格式说明(文末有json格式参考)
created_at datetime 创建时间
  1. roles 功能权限角色表
字段名 类型 注释
id int ID
department_id int 所属部门ID
job_id int 职务ID
name varchar 角色名称
rule_ids varchar 规则ID列表
created_at datetime 创建时间
  1. user_join_roles 用户关联功能权限角色表(如果支持多角色, 就需要这个表)
字段名 类型 注释
id int ID
user_id int 用户ID
role_id int 角色ID
created_at datetime 创建时间
  1. user_join_jobss 用户关联职位表(如果支持多职务, 就需要这个表)
字段名 类型 注释
id int ID
user_id int 用户ID
job_id int 职务ID
created_at datetime 创建时间
  1. 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"
        }
    ]
}
posted @   夏秋初  阅读(217)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
历史上的今天:
2019-04-14 VIM常用快捷键
点击右上角即可分享
微信分享提示