权限系统设计

权限设计

为什么要有权限设计?

对于一个系统,有多个模块,在需要给不同的用户分配不同的模块权限的场景下,就需要进行权限设计,按需给用户划分对应的权限。比如一个企业系统有用户管理模块、财务管理模块、库存管理模块……对于财务人员来说,只需要财务管理模块的相应权限,不应该分配其他模块的权限;而对于库存人员来说,只需要库存管理模块的权限;对于负责人来说,可能需要所有的模块权限。

权限设计的思路

最开始,用户比较少,就可以用最直观的方式,一个用户需要什么功能,就给他分配功能的权限。

但是随着企业人数逐渐变多,需要分配权限的用户越来越多,刚开始 10 个用户的时候可以手动分配,但是 1000 个用户再手动分配就会变得繁琐低效。

通过对功能分配的观察,有很多用户会分配相同或相似的权限,比如对负责人来说,所有的功能权限都要勾选,每次全都勾选十分复杂,因此可以把这些功能打包起来,成为一个“功能集”。因此可以定义一个“角色”拥有一组功能,就将用户和功能完成了解耦,只需要给用户分配一个角色,便拥有了这个角色对应的所有功能。

如何进行权限设计?

权限设计分为功能权限和数据权限

  • 功能权限:用户登录系统后能看到什么模块,能看到哪些页面

  • 数据权限:用户在某个模块里能看到哪些数据

下面以实际项目为例,介绍项目中如何进行权限设计。

背景信息

项目背景为建设文旅产品,以较为有名的“一机游云南”为例,我们要建设一个“一机游云南”的产品,这个产品包含后台管理系统和小程序,可以在后台编辑活动、咨询、公告等模块,具体的模块下既可以编辑云南省的相关信息,也可以编辑下属景区的信息。如可以编辑云南省的公告信息,也可以编辑下属丽江景区的公告信息。

由于模块众多,且景区众多,让一个管理员来管理工作量显然巨大,因此可以给不同景区和不同模块各自分配相应的管理员来管理。比如可以分配一个管理员拥有丽江、大理的公告模块和活动模块,也可以分配另一个管理员拥有玉龙雪山的咨询、景区信息模块。如果一个管理员没有被分配任何一个景区的公告模块权限,那他就无法看到公告模块,如果只分配了丽江的公告模块权限,那么在公告模块下也只能看到和编辑丽江的信息。

权限系统示意图

采用 RBAC 的思想,用户->角色→权限相分离,用户可以配置多个角色,权限为所有角色的合集

页面设计

由于页面设计相对固定,没有频繁变更功能模块的需求,因此通过配置文件的方式实现。

module:
  # 有二级页面
  - tag: "page_management" # module tag 必须全局唯一
  # saas、私有化-全域和私有化景区文旅通都显示
    category:
      - 0
      - 1
      - 2
    name: "页面管理"
    sub:
      - tag: "page_content"
        name: "页面内容管理"
        access:
        - tag: "info"
          name: "查看"
          url:
            - "/tourism_inner/v1/management/info"
            - "/tourism_inner/v1/management/list"
        - tag: "edit"
          name: "编辑"
          url:
            - "/tourism_inner/v1/management/edit"
      - tag: "page_layout"
        name: "页面布局管理"
        access:
        - tag: "info"
          name: "查看"
          url:
            - "/tourism_inner/v1/layout/add"
   # 没有二级页面
  - tag: "scenic_management"
    name: "景区管理"
    # 只有景区文旅通显示
    category:
      - 1
    access:
      - tag: "edit"
        name: "编辑"
        url:
          - "/tourism_inner/v1/scenic/update"

角色设计

设计角色表如下:

CREATE TABLE `role` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `product_id` bigint(20) NOT NULL COMMENT '产品id',
  `name` varchar(20) NOT NULL COMMENT '角色名',
  `category` tinyint(1) NOT NULL COMMENT '类型: 1全域角色 2景区角色',
  `content` text NOT NULL COMMENT '角色内容',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态: 1有效 0无效',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_product` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

content:为该角色关联的模块信息,举例如下:

[
    {
        "tag":"page_content",
        "access":["info", "edit"]
    },
    {
        "tag":"page_layout",
        "access":["edit"]
    },
    {
        "tag": "scenic_management",
        "access": ["edit"]
    }
]

该角色有 页面管理→页面内容管理 的查看和编辑权限,页面管理→页面布局管理 的查看权限。

用户角色关联设计

用户角色授权表为:

CREATE TABLE `authorization` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `authorizer_id` bigint(20) NOT NULL COMMENT '用户id',
  `role_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '角色id',
  `domain_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '全域id',
  `scenic_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '授权景区id',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1有效 0无效',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_authorizer` (`authorizer_id`,`domain_id`,`scenic_id`),
  KEY `idx_domain` (`domain_id`),
  KEY `idx_scenic` (`scenic_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='用户-角色授权表';

role_id 为新增字段。

登录设计

因系统分saas交付和私有化交付,两种系统登录交互差异较大,针对两种交付方式设计如下。

特别注意:因系统需要支持私有化和saas两种形式部署,为解决超管问题,默认权限表(authorization)为空标记为该产品的超级管理员。

saas

saas支持用户申请入驻产品,因此流程图较为复杂。对初次扫码的用户会自动入库(平台用户user表),并依次判断是否申请过产品、产品是否完成审批、审批后查询相关的权限(创建全域或者景区自动对该用户添加管理权限);另外也支持用户扫码申请权限。

用户入驻产品后支持创建不同角色,并绑定相关人员。

saas 内部配置平台超管权限,支持用户入驻的审核。

私有化

  1. 私有化的系统为固定类型文旅通(全域or景区),不可申请入驻。

  2. 用户首次扫码后,需要由我们开发人员操作数据库进行数据初始化,包括:产品、授权表绑定用户。

流程图如下:

其他用户扫码申请授权跟 saas 保持一致,参考上文。

参考链接

RBAC 用户、角色、权限、组设计方案

最好的权限设计,是先区分功能权限和数据权限

角色权限设计的 100 种解法

数据平台的权限设计指南

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flume详解(3)

Host Interceptor 主机拦截器,本质上不是拦截数据,而是在数据的headers中添加一个host字段,可以用于标记数据来源(被收集)的主机。 Host Interceptor可以配置的选项有: 表-22 配置选项 选项 备注 解释 type required 拦截…

翻过DP这座大山

1.AcWing 跳台阶 第一种方法:暴力搜索DFS #include <iostream> using namespace std;int dfs(int n) {if(n 1) return 1;else if(n 2) return 2;else return dfs(n-1)dfs(n-2); }int main() {int x; cin>>x;cout<<dfs(x)<<endl;return 0; }显然如…

CSS设置移动端页面底部安全距离

env(safe-area-inset-bottom)是一个CSS属性值&#xff0c;用于设置底部安全距离。它表示使用环境变量来获取底部安全距离的值。当使用环境变量时&#xff0c;需要使用env()函数来引用具体的环境变量。例如&#xff1a; <style> .box{padding-bottom: env(safe-area-inse…

OSCP靶场--Crane

OSCP靶场–Crane 考点(CVE-2022-23940sudo service提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.229.146 -sC -sV --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-25 08:07 EDT Nmap scan report for 192.16…

MySQL索引18连问,谁能顶住

前言 过完这个节&#xff0c;就要进入金银季&#xff0c;准备了 18 道 MySQL 索引题&#xff0c;一定用得上。 作者&#xff1a;感谢每一个支持&#xff1a; github 1. 索引是什么 索引是一种数据结构&#xff0c;用来帮助提升查询和检索数据速度。可以理解为一本书的目录&…

2-Flume之Sink与Channel

Flume Sink HDFS Sink 将数据写到HDFS上。数据以文件形式落地到HDFS上&#xff0c;文件名默认是以FlumeData开头&#xff0c;可以通过hdfs.filePrefix来修改 HDFS Sink默认每隔30s会滚动一次生成一个文件&#xff0c;因此会导致在HDFS上生成大量的小文件&#xff0c;实际过程…

蔚来JAVA面试(收集)

先叠加&#xff0c;这个是自己找的答案不一定对&#xff0c;只是给我参考看看而已。 一、项目 这个没有&#xff0c;根据实际项目情况来。蔚来比较喜欢拷打项目&#xff0c;所以要对项目非常熟悉&#xff08;慌&#xff09; 二、JAVA基础 2.1 Java中的IO模型有用到过吗&#…

代码学习记录27---贪心算法

随想录日记part27 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.25 主要内容&#xff1a;今天深入学习贪心算法&#xff0c;接下来是针对题目的讲解&#xff1a;1.K次取反后最大化的数组和 &#xff1b;2. 加油站 &#xff1b;3.分发糖果 1005.K次取反后最…

华为防火墙二层墙(VAN/SVI/单臂路由)

二层墙只能做地址池形式的NAT。 交换机安全策略防火墙二层墙 路由器安全策略防火墙三层墙 交换机的光口是不能直接插线的&#xff0c;光模块&#xff0c;包括进和出 长距离&#xff1a;单模 短距离&#xff1a;多模 防火墙自身的ping流量需要单独配置

202447读书笔记|《围炉夜话》——多记先正格言,胸中方有主宰 闲看他人行事,眼前即是规箴

202447读书笔记|《围炉夜话》——多记先正格言&#xff0c;胸中方有主宰&#xff1b;闲看他人行事&#xff0c;眼前即是规箴 围炉夜话 《围炉夜话&#xff08;读客三个圈经典文库&#xff09;》作者王永彬。读《围炉夜话》&#xff0c;可以掌握君子安身立业的大智慧&#xff01…

MySQL数据库的备份

文章目录 MySQL数据库的备份MySQL备份方法完全备份物理备份备份 逻辑热备完全备份逻辑热备恢复恢复库恢复表 增量备份备份增量备份恢复基于位置进行恢复基于时间 MySQL数据库的备份 MySQL备份方法 物理备份&#xff1a; 物理备份涉及直接复制MySQL的数据文件和日志文件。这种…

(进程线程)的状态和线程安全

进程有两个状态就绪状态和阻塞状态。 这些状态决定了系统会按照什么样的态度来调度这个进程&#xff08;这些一般是针对一个进程里面有一个线程的情况&#xff09;。在实际的大多数情况下&#xff0c;一个进程中包含多个线程&#xff0c;其状态则会绑定在线程上。 上诉状态一…

计算机408炸了!大多数人都栽在这门课上

组成原理>>数据结构>操作系统>计算机网络 在本科时&#xff0c;我在学习组成原理之前已经学过数字电路和模拟电路&#xff0c;但在接下来学习组成原理时&#xff0c;我依然感到困难。也许是因为自己理解能力不足&#xff0c;总觉得难以掌握&#xff0c;甚至在考研…

算法打卡day28|贪心算法篇02|Leetcode 122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏 II

算法题 Leetcode 122.买卖股票的最佳时机 II 题目链接:122.买卖股票的最佳时机 II 大佬视频讲解&#xff1a;买卖股票的最佳时机 II视频讲解 个人思路 因为只有一只股票&#xff0c;且两天作一个交易单元&#xff0c;那每次只收集正利润就可以最终最多可以获取的利润&#xf…

数据运营常用的8大模型

✅作者简介&#xff1a;《数据运营&#xff1a;数据分析模型撬动新零售实战》作者、《数据实践之美》作者、数据科技公司创始人、多次参加国家级大数据行业标准研讨及制定、高端企培合作讲师。 &#x1f338;公众号&#xff1a;风姑娘的数字视角&#xff0c;免费分享数据应用相…

10个优秀的Github开源项目

1Panel 是一个现代化、开源的 Linux 服务器运维管理面板 EX-chatGPT-精准搜索工具 feishu-chatgpt-飞一般的工作体验工具 Knife4j-是一个集Swagger2 和 OpenAPI3为一体的增强解决方案 Kooder 是 Gitee 团队开发的一个代码搜索系统 mtbird 是一款低代码可视化页面生成器 S…

<Linux> 模拟实现文件流 - 简易版

目录 1. FILE 结构设计 2、函数使用及分析 3、文件打开 fopen 4. 缓冲区刷新fflush 5. 数据写入fwrite 6. 文件关闭 fclose 7. 测试 8. 小结 1. FILE 结构设计 在设计 FILE 结构体前&#xff0c;首先要清楚 FILE 中有自己的缓冲区及冲刷方式 缓冲区的大小和刷新方式因…

巧用 20个 Linux 命令贴士与技巧,让你生产力瞬间翻倍?

在本文中&#xff0c;我将向您演示一些专业的Linux命令技巧&#xff0c;这些技巧将使您节省大量时间&#xff0c;在某些情况下还可以避免很多麻烦&#xff0c;而且它也将帮助您提高工作效率。 并不是说这些只是针对初学者的 Linux 技巧。即使有经验的Linux用户也有可能没有发现…

C++ 扫描当前路径下文件并删除大文件

C 扫描当前路径下文件并删除大文件 C获取当前路径扫描文件路径下规定后缀名称的文件计算文件大小 1. 获取当前路径 使用<Windows.h>中的GetCurrentDirectory方法实现&#xff0c;单独编写验证程序如下&#xff1a; #include<iostream> #include<Windows.h&g…

R语言基础入门

1.保存或加载工作空间 改变工作目录——进行文件读写&#xff0c;默认去指定文件进行操作。&#xff08;使用R时&#xff0c;最好先设定工作目录&#xff08;setwd(),getwd()&#xff09;&#xff09; setwd(“工作文件路径”)&#xff1a;建立工作目录 getwd&#xff08;&…
最新文章