权限五张表

news2025/3/12 19:07:06

重点:权限五张表的设计

核心概念:

在权限管理系统中,经典的设计通常涉及五张表,分别是用户表、角色表、权限表、用户角色表和角色权限表。这五张表的设计可以有效地管理用户的权限,确保系统的安全性和灵活性。

  • 用户(User):系统的使用者,每个用户有唯一的身份标识。
  • 角色(Role):一组权限的集合,用于简化权限分配。
  • 权限(Permission):系统中具体的操作或资源访问权限(如读取、写入、删除等)。
  • 用户角色关联:将用户与角色关联起来,表示用户拥有某个角色的权限。
  • 角色权限关联:将角色与权限关联起来,表示角色拥有哪些权限。

表之间的关系

  1. 用户与角色

    • 一个用户可以有多个角色,一个角色可以分配给多个用户。
    • 通过user_role表实现多对多关系。
  2. 角色与权限

    • 一个角色可以有多个权限,一个权限可以分配给多个角色。
    • 通过role_permission表实现多对多关系。
  3. 权限层级

    • 用户通过角色间接拥有权限。
    • 查询用户权限时,需要先查询用户所属角色,再查询角色对应的权限。

图示理解表关系


1.表设计

1.1 用户表(user

  • 用户表用于存储系统中的用户信息,包括用户ID、用户名和用户密码等。每个用户在登录时都会通过该表进行验证,以确保其合法性。
CREATE TABLE `user` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `username` VARCHAR(50) NOT NULL UNIQUE,
    `password` VARCHAR(255) NOT NULL,
    `email` VARCHAR(100),
    `active` TINYINT(1) NOT NULL DEFAULT 1,
    `version` INT NOT NULL DEFAULT 0,
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

1.2 角色表(role

  • 角色表用于定义系统中的各种角色,例如管理员、普通用户等。每个角色代表一组权限,用户通过分配角色来获得相应的权限。
CREATE TABLE `role` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL UNIQUE,
    `description` VARCHAR(255),
    `active` TINYINT(1) NOT NULL DEFAULT 1,
    `version` INT NOT NULL DEFAULT 0,
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

1.3 权限表(permission

  • 权限表用于存储系统中的各种资源和操作,例如页面访问、按钮点击等。每个权限项描述了一个具体的操作,用户只有拥有相应的权限才能执行该操作。
CREATE TABLE `permission` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL UNIQUE,
    `description` VARCHAR(255),
    `active` TINYINT(1) NOT NULL DEFAULT 1,
    `version` INT NOT NULL DEFAULT 0,
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

1.4 用户角色关联表(user_role

  • 用户角色表用于建立用户与角色之间的关系。通过该表,可以将用户分配到不同的角色,从而获得相应的权限。
CREATE TABLE `user_role` (
    `user_id` INT NOT NULL,
    `role_id` INT NOT NULL,
    `active` TINYINT(1) NOT NULL DEFAULT 1,
    `version` INT NOT NULL DEFAULT 0,
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`user_id`, `role_id`),
    FOREIGN KEY (`user_id`) REFERENCES `user`(`id`),
    FOREIGN KEY (`role_id`) REFERENCES `role`(`id`)
);

1.5 角色权限关联表(role_permission

  • 角色权限表用于建立角色与权限之间的关系。通过该表,可以为每个角色分配不同的权限,从而实现用户到角色,角色到权限的转换。
CREATE TABLE `role_permission` (
    `role_id` INT NOT NULL,
    `permission_id` INT NOT NULL,
    `active` TINYINT(1) NOT NULL DEFAULT 1,
    `version` INT NOT NULL DEFAULT 0,
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`role_id`, `permission_id`),
    FOREIGN KEY (`role_id`) REFERENCES `role`(`id`),
    FOREIGN KEY (`permission_id`) REFERENCES `permission`(`id`)
);

2.实现案例

场景:学生管理系统中有管理员、教师、学生三种角色。

  • 管理员可以管理所有数据。
  • 教师可以管理学生成绩。
  • 学生只能查看自己的成绩。

2.1 查询用户的角色

SELECT r.name
FROM `user` u
JOIN `user_role` ur ON u.id = ur.user_id
JOIN `role` r ON ur.role_id = r.id
WHERE u.username = 'test_user' AND u.active = 1 AND r.active = 1;

2.2 查询用户的权限

SELECT p.name AS permission_name
FROM user u
JOIN user_role ur ON u.id = ur.user_id
JOIN role_permission rp ON ur.role_id = rp.role_id
JOIN permission p ON rp.permission_id = p.id
WHERE u.username = 'student1';

2.3 查询所有教师角色

SELECT u.username
FROM user u
JOIN user_role ur ON u.id = ur.user_id
JOIN role r ON ur.role_id = r.id
WHERE r.name = 'teacher';

2.4 逻辑删除用户

UPDATE `user` SET active = 0 WHERE id = 1;

2.5 使用乐观锁更新用户信息

UPDATE user
SET email = 'new_teacher1@test.com', version = version + 1
WHERE username = 'teacher1' AND version = 0; -- 假设当前版本号为0

MySQL中的权限五张表(了解,选择性观看!)

1. 了解MySQL权限系统

​ MySQL通过权限系统控制用户对数据库、表、列等的访问权限。权限信息存储在mysql数据库的五张表中:userdbtables_privcolumns_privprocs_priv。这些表是层级关系,MySQL在检查权限时从上到下依次检查。

SELECT * FROM mysql.user WHERE User = 'test_user';

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.权限五张表

表1:user

  • 作用:存储全局权限,即用户对所有数据库的权限。在任一数据库中都可以使用

  • 关键字段

    • Host:允许用户连接的主机(如localhost%)。
    • User:用户名。
    • 权限字段:如Select_privInsert_privUpdate_priv等,表示用户是否拥有对应的全局权限。
    • Grant_priv:用户是否可以授权其他用户权限
  • 示例

    SELECT Host, User, Select_priv, Insert_priv FROM mysql.user WHERE User = 'test_user';
    

    解释:这条查询会显示用户test_user在所有数据库上的SELECTINSERT权限。


表2:db

  • 作用

    • 存储用户对特定数据库的权限。
    • 如果用户在user表中没有全局权限,MySQL会检查db表,判断用户是否有权限访问某个数据库。
  • 关键字段

    • HostUser:与user表相同。
    • Db:数据库名称。
    • 权限字段:如Select_privInsert_priv等,表示用户在该数据库上的权限。
  • 示例

    SELECT Host, User, Db, Select_priv, Insert_priv FROM mysql.db WHERE User = 'test_user';
    

    解释:这条查询会显示用户test_usertest_db数据库上的权限。


表3:tables_priv

  • 作用:存储用户对特定表的权限。

  • 关键字段

    • HostUserDb:与db表相同。
    • Table_name:表名称。
    • Table_priv:用户在该表上的权限(如SelectInsert等)。
    • Column_priv:用户在该表的列上的权限(如果有)。
  • 示例

    SELECT Host, User, Db, Table_name, Table_priv FROM mysql.tables_priv WHERE User = 'test_user';
    

    解释:这条查询会显示用户test_usertest_db.test_table表上的权限。


表4:columns_priv

  • 作用:存储用户对特定列的权限。

  • 关键字段

    • HostUserDbTable_name:与tables_priv表相同。
    • Column_name:列名称。
    • Column_priv:用户在该列上的权限(如SelectInsert等)。
  • 示例

    SELECT Host, User, Db, Table_name, Column_name, Column_priv FROM mysql.columns_priv WHERE User = 'test_user';
    

    解释:这条查询会显示用户test_usertest_db.test_table表中特定列上的权限。


表5:procs_priv

  • 作用

    • 存储用户对存储过程和函数的权限。
    • 如果用户需要执行存储过程或函数,MySQL会检查procs_priv表。
  • 关键字段

    • HostUserDb:与db表相同。
    • Routine_name:存储过程或函数的名称。
    • Routine_type:类型(PROCEDUREFUNCTION
    • Proc_priv:用户对该存储过程或函数的权限(如Execute)。
  • 示例

    SELECT Host, User, Db, Routine_name, Routine_type, Proc_priv FROM mysql.procs_priv WHERE User = 'test_user';
    

    解释:这条查询会显示用户test_usertest_db数据库中存储过程和函数上的权限。


3.权限检查流程

  • MySQL在检查用户权限时,按照以下顺序检查:
    1. 检查user表中的全局权限。
    2. 检查db表中的数据库权限。
    3. 检查tables_priv表中的表权限。
    4. 检查columns_priv表中的列权限。
    5. 检查procs_priv表中的存储过程和函数权限。
  • **注意:**如果某一层级的权限满足要求,MySQL就不会继续检查下一层级。

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

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

相关文章

Docker-数据卷

1.数据卷 容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题: 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了&#xff1…

IT : 是工作還是嗜好? Delphi 30周年快乐!

又到2月14日了, 自从30多年前收到台湾宝蓝(Borland)公司一大包的3.5 磁盘片, 上面用黑色油性笔写着Delphi Beta开始, Delphi便和我的工作生涯有了密不可分的关系. 一年后Delphi大获成功, 自此对于使用Delphi的使用者来说2月14日也成了一个特殊的日子! 我清楚记得Delphi Beta使用…

DeepPose

目录 摘要 Abstract DeepPose 算法框架 损失函数 创新点 局限性 训练过程 代码 总结 摘要 DeepPose是首个将CNN应用于姿态估计任务的模型。该模型在传统姿态估计方法的基础上,通过端到端的方式直接从图像中回归出人体关键点的二维坐标,避免了…

[HarmonyOS]鸿蒙(添加服务卡片)推荐商品 修改卡片UI(内容)

什么是服务卡片 ? 鸿蒙系统中的服务卡片(Service Card)就是一种轻量级的应用展示形式,它可以让用户在不打开完整应用的情况下,快速访问应用内的特定功能或信息。以下是服务卡片的几个关键点: 轻量级&#…

DeepSeek R1 本地部署和知识库搭建

一、本地部署 DeepSeek-R1,是幻方量化旗下AI公司深度求索(DeepSeek)研发的推理模型 。DeepSeek-R1采用强化学习进行后训练,旨在提升推理能力,尤其擅长数学、代码和自然语言推理等复杂任务 。 使用DeepSeek R1, 可以大大…

领域驱动设计叕创新,平安保险申请DDD专利

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 见下图: 这个名字拼得妙:领域驱动设计模式。 是领域驱动设计?还是设计模式?还是领域驱动设计设计模式?和下面这个知乎文章的…

团体程序设计天梯赛-练习集——L1-041 寻找250

前言 10分的题,主要的想法就一个,按这个想法可以出几个写法 L1-041 寻找250 对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。 输入格式: 输入在一行中给出不知道多少个绝对值…

C#控制台大小Console.SetWindowSize函数失效解决

在使用C#修改控制台大小相关API会失效. 由于VS将控制台由命令提示符变成了终端,因此在设置大小时会出现问题 测试代码: Console.SetWindowSize(100, 50);

spring boot 对接aws 的S3 服务,实现上传和查询

1.aws S3介绍 AWS S3(Amazon Simple Storage Service)是亚马逊提供的一种对象存储服务,旨在提供可扩展、高可用性和安全的数据存储解决方案。以下是AWS S3的一些主要特点和功能: 1.1. 对象存储 对象存储模型:S3使用…

25/2/16 <算法笔记> DirectPose

DirectPose 是一种直接从图像中预测物体的 6DoF(位姿:6 Degrees of Freedom)姿态 的方法,包括平移和平面旋转。它在目标检测、机器人视觉、增强现实(AR)和自动驾驶等领域中具有广泛应用。相比于传统的位姿估…

数据结构-8.Java. 七大排序算法(下篇)

本篇博客给大家带来的是排序的知识点, 由于时间有限, 分两天来写, 下篇主要实现最后一种排序算法: 归并排序。同时把中篇剩下的快排非递归实现补上. 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是…

DeepSeek私有化部署+JAVA通过API调用离线大模型问答

在当今快速发展的数字化时代,企业对于高效、灵活的技术解决方案需求日益增长。DeepSeek作为一款领先的智能搜索与分析平台,凭借其强大的数据处理能力和精准的搜索结果,已经成为众多企业提升运营效率的得力助手。为了更好地满足企业对数据安全…

【吾爱出品】针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版

针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版 链接:https://pan.xunlei.com/s/VOJ8PZd4avMubnDzHQAeZDxWA1?pwdnjwm# 直接复制到游戏安装目录,保持与游戏主程序同目录下。

内容中台驱动企业数字化内容管理高效协同架构

内容概要 在数字化转型加速的背景下,企业对内容管理的需求从单一存储向全链路协同演进。内容中台作为核心支撑架构,通过统一的内容资源池与智能化管理工具,重塑了内容生产、存储、分发及迭代的流程。其核心价值在于打破部门壁垒,…

【第14章:神经符号集成与可解释AI—14.4 神经符号集成与可解释AI的未来发展趋势与挑战】

想象一下,如果AI既能像人类一样直觉感知(比如一眼认出街角的咖啡店),又能像数学家一样逻辑推理(比如计算最优路线避开拥堵),这个世界会变成什么样?这种“双脑协同”正是神经符号集成技术的终极目标。 但现实是,当前99%的AI系统要么只会“死记硬背”数据(如深度学习模…

[Spring Boot] Expense API 实现

[Spring Boot] Expense API 实现 项目地址:expense-api 项目简介 最近跟着视频做的一个 spring boot 的项目,包含了比较简单的记账功能的实现(只限 API 部分),具体实现的功能有: 记账(expen…

设置默认构建变体 Build Variant

Android Studio在打开项目时有时会把我设置好的build Variant改为默认的变体,没注意的话可能打完包才发现打错了,浪费时间。因此,有必要通过代码设置一个我想要的默认变体。 代码其实很简单,只要在变体下面加上isDefault true即可…

【大模型】DeepSeek使用与原理解析:从V3到R1

文章目录 一、引言二、使用与测评1.7大R1使用技巧2.官网实测 发展历程三、Deepseek MoE:专家负载均衡 (2024年1月)四、GRPO:群体相对策略优化(DeepSeek-Math,2024年4月)五、三代注意力&#xff…

DAY04 Object、Date类、DateFormat类、Calendar类、Math类、System类

学习目标 能够说出Object类的特点是所有类的祖宗类,任意的一个类都直接或者间接的继承了Object类,都可以使用Object类中的方法Animal extends Object:直接继承Cat extends Animal:间接继承 能够重写Object类的toString方法altinsert,选择toString 能够重写Object类的equals方法…

图像生成GAN和风格迁移

文章目录 摘要abstract1.生成对抗网络 GAN1.1 算法步骤 2.风格迁移2.1 损失函数2.2 论文阅读2.2.1 简介2.2.2 方法2.2.3 实验2.2.4 结论 3.总结 摘要 本周学习了生成对抗网络(GAN)与风格迁移技术在图像生成中的应用。首先介绍了GAN模型中生成器与判别器…