【水文】角色权限设计
参考
备注
本文章仅仅思考了简单的功能权限与数据权限的实现,建议具体参考上面的引用链接进行学习。
表结构定义
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
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号