当前位置: 首页 > news >正文

MySQL:数据库权限与角色

权限

MySQL 的权限管理系统是保障数据库安全性的关键组件之一。它允许数据库管理员精确控制哪些用户可以对哪些数据库对象执行哪些操作。

自主存取控制 DAC(DiscretionaryAccess Control):用户对于不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限,用户可以“自主”地决定将数据的存取权限授予何人、决定是否也将“授权数据库安全性控制的权限授予别人。

SQL 中使用 GRANT 语句向用户授予对数据操作的权限,REVOKE 语句收回已经授予用户的权限。

![[DAC Privilege in Database.png]]

权限的类型

MySQL的权限类型涵盖了用户对数据库和数据库对象可以执行的各种操作,包括但不限于以下几种:

  • SELECT:允许用户查询表中的数据。

  • INSERT:允许用户向表中插入新的数据行。

  • UPDATE:允许用户更新表中的数据。

  • DELETE:允许用户从表中删除数据。

  • CREATE:允许用户创建新的数据库、表、索引等对象。

  • DROP:允许用户删除数据库、表、索引等对象。

  • ALTER:允许用户修改表结构,如添加或删除列、修改列的数据类型等。

  • INDEX:允许用户创建或删除索引。

  • CREATE ROUTINE:允许用户创建存储过程或函数。

  • ALTER ROUTINE:允许用户修改或删除存储过程或函数。

  • EXECUTE:允许用户执行存储过程或函数。

  • GRANT OPTION:允许用户将自己拥有的权限授予其他用户。

  • SUPER:超级权限,允许用户执行一些高级管理任务,如关闭MySQL服务、更改全局变量等。

此外,还有如USAGE(连接权限,无实际操作权限)、FILE(对服务器主机上文件的访问权限)、PROCESS(查看服务器中所有会话的权限)、SHUTDOWN(关闭服务器的权限)等权限。

权限的级别

MySQL 的权限按其作用范围可分为不同的级别,这些级别从大到小依次为:

  1. 全局级别(Global Level)

    • 权限控制整个MySQL服务器上的操作,对所有数据库、表和列都有效。

    • 使用 *.* 来指定授权范围,例如 GRANT ALL PRIVILEGES ON *.* TO 'user'@'host';

    • 权限信息存储在 mysql.user 表中。

  2. 数据库级别(Database Level)

    • 权限限制用户对指定数据库的操作,包括对该数据库中所有表和列的访问。

    • 使用 database_name.* 来指定授权范围,例如 GRANT SELECT, INSERT ON database_name.* TO 'user'@'host';

    • 权限信息存储在 mysql.db 表中。

  3. 表级别(Table Level)

    • 权限控制用户对具体表的操作,如查询、插入、更新和删除表中的记录。

    • 使用 database_name.table_name 来指定授权范围,例如GRANT UPDATE ON database_name.table_name TO 'user'@'host';

    • 权限信息存储在 mysql.tables_priv 表中。

  4. 列级别(Column Level)

    • 权限控制用户对表中指定列的访问,这是MySQL权限系统中最细粒度的控制。

    • 使用 database_name.table_name(column_name1, column_name2, ...) 来指定授权范围。

    • 权限信息存储在 mysql.columns_priv 表中。

  5. 例行程序级别(Routine Level)

    • 权限控制用户对存储过程和函数的访问,包括执行、修改和删除存储过程或函数。

    • 使用 PROCEDUREFUNCTION 关键字以及具体的存储过程或函数名来指定授权范围。

    • 权限信息存储在 mysql.procs_priv 表中。

通过合理设置不同级别的权限,数据库管理员可以确保数据库的安全性和数据的完整性,同时满足不同用户对数据库资源的访问需求。在实际应用中,建议遵循最小权限原则,即只授予用户完成其工作所需的最小权限集,以减少潜在的安全风险。

权限的管理

授权权限 GRANT

在 MySQL 中,使用 GRANT 语句 授予指定用户对指定操作对象的指定操作权限。可以根据需要为用户分配特定的权限。

执行 GRANT 语句需要具有相应权限的用户才能执行:

  • DBA
  • 数据库对象的创建者
  • 已经拥有该权限的用户

语法如下:

GRANT <Privilege> [,Privilege2, ...]
ON [obj_type]<obj_name>[,<obj2_type><obj2_name>]...
TO <username>[,usernames,...]
[@'IP']
[WITH GRANT OPTION];
  • <Privilege>: 指定要授予的权限。可以使用特定的权限关键字,比如 SELECT、INSERT、UPDATE、DELETE、CREATE、DROP 等,也可以使用 ALL PRIVILEGES 来表示所有权限。

  • [obj_type]: 指定对象的类型,例如 TABLE、DATABASE、PROCEDURE 等。如果不指定,默认为 TABLE。

  • <obj_name>: 指定对象的名称,可以是表名、数据库名、过程名等。如果要授予多个对象的权限,可以使用逗号分隔它们。

  • <username>: 指定要授予权限的用户名。可以是一个具体的用户名,也可以使用 PUBLIC 来表示所有用户。

可选项:

  • 'IP': 如果指定了 IP 地址,则表示要授予该 IP 地址的用户相应的权限。可以使用具体的 IP 地址,也可以使用通配符 ‘%’ 来表示任意 IP 地址。

  • WITH GRANT OPTION:SQL标准允许具有 WITH GRANT OPTION 的用户把自己拥有的权限或其子集传递授予其他用户,但不允许循环授权,即被授权者不能把权限再授回给授权者或其祖先。建议只将 WITH GRANT OPTION 授予具有适当权限的管理员或特定需要此功能的用户。

  • 发出该 GRANT 语句的可以是数据库管理员,也可以是该数据库对象创建者(即属主owner),还可以是已经拥有该权限的用户。

  • 接受权限的用户可以是一个或多个具体用户,也可以是 PUBLIC,即全体用户。

刷新权限

授予用户权限后,可以使用 FLUSH PRIVILEGES 语句刷新权限,使授权更改生效。

FLUSH PRIVILEGES;
创建用户的同时授权

使用 GRANT 语句,可以在创建用户的同时,为用户授权:

GRANT privilege ON database.table_name
TO 'username'[@'ip']
[WITH GRANT OPTION];
示例
  1. 授予用户 user1 对表 employees 的 SELECT,INSERT 和 UPDATE 特定列 Sname 的权限:
GRANT SELECT, INSERT, UPDATE(Sname) 
ON TABLE employees TO user1;
  1. 授予用户 user2user3 对数据库 ecommerce 的所有权限,并允许该用户将自己拥有的权限授予其他用户:
GRANT ALL PRIVILEGES ON ecommerce.*
TO user2,user3
WITH GRANT OPTION;
  1. 授予用户 user4 对表 orderscustomers 的 DELETE 权限,并限制仅允许从特定的 IP 地址登录:
GRANT DELETE ON orders,customers TO user4 @'192.168.0.100';
查看用户权限

查看已经授权给用户权限信息:

SHOW GRANTS FOR 'username'@'host'

查看创建用户的语句:

SHOW CREATE USER 'username'@'host'
收回权限 REVOKE

在 MySQL 中,使用 REVOKE 语句收回某用户的权限,可以使已被授权的用户失去其指定权限。

只有拥有 GRANT OPTION 权限的账户才能够执行 REVOKE 命令并从其他用户账户中撤销权限。

REVOKE <Privilege> [,Privilege2, ...]
ON [obj_type]<obj_name>[,<obj2_type><obj2_name>]...
FROM <username>[,usernames,...]
[@'IP']
[CASCADE|RESTRICT];
  • <Privilege>:要收回的权限,如 SELECT、INSERT、UPDATE、DELETE 等。

  • obj_type:可选部分,指定对象的类型,如 TABLE、PROCEDURE 等。如果不指定,默认为 TABLE。

  • obj_name:要收回权限的对象的名称。

  • <username>:指定要收回权限的用户,可以是单个用户或多个用户。

  • [@'IP']:可选部分,指定用户的主机名或 IP 地址。如果不指定,默认为所有主机。

  • [CASCADE|RESTRICT]:可选部分,用于指定是否级联撤销权限或限制撤销权限。

    • CASCADE 表示级联撤销(收回某用户权限的同时也会把该用户所有授权过用户的权限一并收回)
    • RESTRICT 表示限制(只收回指定的用户权限)。
示例

通常情况下,REVOKE 应该与 GRANT 保持一致,即撤销时应该指定与 GRANT 相同的权限、数据库和表,并取消所有选项,包括 WITH GRANT OPTION。这样可以确保权限被正确、彻底地收回。

  1. 收回用户 user1 对表 employees 的 SELECT 和 INSERT 权限:
REVOKE SELECT,INSERT ON employees FROM user1;
  1. 收回用户 user2 对数据库 ecommerce 中所有表的 ALL PRIVILEGES 权限:
REVOKE ALL PRIVILEGES ON ecommerce.* FROM user2@'host';

REVOKE 只会撤销已经授予的权限,未授权的权限无法被收回。除非用户重新授权,否则收回权限后,用户将无法再执行与该权限相关的操作。

数据库角色

数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。因此,可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程。

在创建数据库时,管理员通常会分配给每个用户一个特定的角色,并指定一组权限和访问权限,以便他们仅能够执行与其角色相关联的操作。这有助于提高数据的安全性和管理。

MySQL 8.0 引入了角色(Role)的概念,可以方便地为用户分配和管理权限。角色使管理员能够更好地管理用户权限并简化权限管理过程。

要使用角色功能,需要在 MySQL 中启用角色授权。在 my.cnf 或 my.ini 文件中,确保 --default-authentication-plugin=mysql_native_password--enable-named-roles 参数被启用。

角色与用户的关系

  • 用户可以被赋予一个或多个角色。

  • 用户登录后,可以使用 SET ROLE 命令激活或取消激活特定的角色。

  • 用户的权限由其自身权限和激活的角色权限共同决定。

角色的继承

  • 当一个角色被授予另一个角色时,被授予的角色会继承所有直接授予它的权限,以及间接通过其他角色授予的权限。

  • 角色的权限继承是递归的,这意味着如果一个角色被授予了另一个角色,那么它也会继承所有被间接授予的权限。

操作与管理角色

在 MySQL 中首先用 CREATE ROLE 语句创建角色,然后用 GRANT 语句给角色授权,用 REVOKE 语句收回授予角色的权限。

创建角色

使用 CREATE ROLE 命令创建一个新的角色。角色名称应符合 MySQL 的标识符命名规则。

CREATE ROLE 'role_name';
向角色授权

使用 GRANT 命令向角色授予特定的权限。

GRANT privilege
ON [obj_type]'obj_name'
TO 'role_name'[,'role2',...];
  • privilege 是要授予的角色权限

  • obj_typeobj_name 表示权限作用的对象类型和名称。

将角色授予用户或其他角色

使用 GRANT 命令将一个或多个角色授予用户或其他角色。

GRANT 'role1'[,'role2',...]
TO ['role3'|'username'][,...]
[WITH ADMIN OPTION]
  • 如果指定了 WITH ADMIN OPTION 子句,则获得某种权限的角色或用户还可以把这种权限再授予其他的角色。

  • 一个角色包含的权限:包括直接授予这个角色的全部权限加上其他角色授予这个角色的全部权限。

收回角色的权限

使用 REVOKE 命令从角色中收回特定的权限。

REVOKE privilege
ON ['obj_type']'obj_name'
FROM 'role1'[,'role2',...];

只有拥有 GRANT OPTION 权限的账户才能够执行 REVOKE 命令并从其他用户账户中撤销权限。

删除角色

使用 DROP ROLE 命令删除一个角色。在删除角色之前,请确保没有用户正使用该角色,否则可能会导致权限混乱。

DROP ROLE 'role_name'

相关文章:

MySQL:数据库权限与角色

权限 MySQL 的权限管理系统是保障数据库安全性的关键组件之一。它允许数据库管理员精确控制哪些用户可以对哪些数据库对象执行哪些操作。 自主存取控制 DAC&#xff08;DiscretionaryAccess Control)&#xff1a;用户对于不同的数据库对象有不同的存取权限&#xff0c;不同的…...

等保测评练习卷25

等级保护初级测评师试题25 姓名&#xff1a; 成绩&#xff1a; 一、判断题&#xff08;10110分&#xff09; 1.安全区域边界对象主要根据系统中网络访问控制设备的部署情况来确定&#xff08;&#xff09;不是网络访问控制设备而…...

《python语言程序设计》2018第6章第28题 掷骰子 两个色子,分别是1到6

2、3、12 玩家输 7、11玩家赢 4、5、6、8、9、10算1点&#xff0c;之后出7玩家输或者和上一次相同。def rolled(num_t):count 0still_win 0second_win 0still_lose 0second_lose 0while count < num_t:a_1 random.randint(1, 6)b_1 random.randint(1, 6)tTen a_1 b…...

Java方法递归

目录 1.方法递归调用 基本介绍 递归能解决什么问题&#xff1f; 八皇后问题 递归举例 递归重要规则 练习 2.递归调用应用实例-迷宫问题 3.递归调用实例-汉诺塔 4.递归调用实例-八皇后问题 1.方法递归调用 基本介绍 简单来说&#xff0c;递归就是自己调用自己。 …...

目标跟踪那些事

目标跟踪那些事 跟踪与检测的区别 目标跟踪和目标检测是计算机视觉中的两个重要概念&#xff0c;但它们的目的和方法是不同的。 目标检测(object Detection)&#xff1a;是指在图像或视频帧中识别并定位一个或多个感兴趣的目标对象的过程 。 目标跟踪(object Tracking)&…...

【Git】 如何将一个分支的某个提交合并到另一个分支

【Git】 如何将一个分支的某个提交合并到另一个分支 在使用 Git 进行版本控制时&#xff0c;常常会遇到这样的需求&#xff1a;将某个分支的特定提交合并到另一个分支中。这种情况下&#xff0c;我们可以使用 cherry-pick 命令来实现。本文将详细介绍 cherry-pick 命令的使用方…...

【嵌入式之RTOS】什么是消息队列

目录 一、FreeRTOS消息队列的基本概念 二、FreeRTOS消息队列的工作原理 三、FreeRTOS消息队列的特点 四、FreeRTOS消息队列的应用 五、示例 消息队列是一种用于任务间通信的机制&#xff0c;它允许一个任务&#xff08;生产者&#xff09;向消息队列发送消息&#xff0c;而…...

9-springCloud集成nacos config

本文介绍spring cloud集成nacos config的过程。 0、环境 jdk 1.8maven 3.8.1Idea 2021.1nacos 2.0.3 1、项目结构 根项目nacos-config-sample下有两个module&#xff0c;这两个module分别是两个springboot项目&#xff0c;都从nacos中获取连接mysql的连接参数。我们开工。 …...

市场主流 AI 视频生成技术的迭代路径

AI视频生成技术的迭代路径经历了从GANVAE、Transformer、Diffusion Model到Sora采用的DiT架构&#xff08;TransformerDiffusion&#xff09;等多个阶段&#xff0c;每个阶段的技术升级都在视频处理质量上带来了飞跃性的提升。这些技术进步不仅推动了AI视频生成领域的快速发展&…...

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——1.c++入门(2)

1. 函数重载 C⽀持在同⼀作⽤域中出现同名函数&#xff0c;但是要求这些同名函数的形参不同&#xff0c;可以是参数个数不同或者 类型不同。这样C函数调⽤就表现出了多态⾏为&#xff0c;使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。 #include<iostream> u…...

【Python系列】深入理解 Python 中的 `nonlocal` 关键字

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Flask目录结构路由重定向简单实例讲解——轻量级的 Python Web 框架

假设一个flask目录结构如下&#xff1a; my_flask_app/ │ ├── app.py ├── routes/ │ ├── __init__.py │ ├── ZhejiangProvince/ │ │ ├── __init__.py │ │ ├── la.py │ │ └── el.py │ ├── GuangdongProvince/ │ │ ├…...

破解PyCharm插件更新难题:让IDE焕发新生

破解PyCharm插件更新难题&#xff1a;让IDE焕发新生 PyCharm作为业界领先的集成开发环境&#xff08;IDE&#xff09;&#xff0c;其丰富的插件生态是其强大功能的重要来源。然而&#xff0c;插件无法更新的问题可能会困扰许多用户&#xff0c;影响开发体验。本文将详细介绍如…...

cmake常用命令学习

1.include https://blog.csdn.net/qq_38410730/article/details/102677143 CmakeLists.txt才是cmake的正统文件&#xff0c;而.cmake文件是一个模块文件&#xff0c;可以被include到CMakeLists.txt中。 include指令一般用于语句的复用&#xff0c;也就是说&#xff0c;如果有…...

K8S可视化管理平台KubeSphere

什么是 KubeSphere &#xff1f; KubeSphere 是一款开源项目&#xff0c;在目前主流容器调度平台 Kubernetes 之上构建的企业级分布式多租户容器管理平台&#xff0c;提供简单易用的操作界面以及向导式操作方式&#xff0c;在降低用户使用容器调度平台学习成本的同时&#xff…...

Bugku-CTF-聪明的php

pass a parameter and maybe the flag files filename is random :> 传递一个参数&#xff0c;可能标记文件的文件名是随机的: 于是传一下参&#xff0c;在原网页后面加上/?a1,发现网页出现了变化 3.传入参数&#xff0c;一般情况下是文件包含&#xff0c;或者命令执行&…...

【MySQL进阶】MySQL主从复制

目录 MySQL主从复制 概念 主从形式 一主多从 多主一从 双主复制 主从级联复制 主从复制原理 三个线程 两个日志文件 主从复制的主要工作模式 异步复制 半同步复制 全同步复制 MySQL主从复制 概念 MySQL主从复制是一种数据分布机制&#xff0c;允许从一个数据库服…...

本地部署文生图模型 Flux

本地部署文生图模型 Flux 0. 引言1. 本地部署1-1. 创建虚拟环境1-2. 安装依赖模块1-3. 创建 Web UI1-4. 启动 Web UI1-5. 访问 Web UI 0. 引言 2024年8月1日&#xff0c;blackforestlabs.ai发布了 FLUX.1 模型套件。 FLUX.1 文本到图像模型套件&#xff0c;该套件定义了文本到…...

谷粒商城实战笔记-127-全文检索-ElasticSearch-整合-测试复杂检索

文章目录 一&#xff0c;使用Elasticsearch的Java RESTHighLevel Client完成复杂的查询请求1. 创建检索请求 (SearchRequest)2. 构造检索条件 (SearchSourceBuilder)3. 执行检索 (SearchResponse)4. 处理解析结果5. 获取聚合信息 二&#xff0c;AI时代的效率提升 一&#xff0c…...

解锁PyCharm:破解依赖库导入之谜

解锁PyCharm&#xff1a;破解依赖库导入之谜 PyCharm作为Python开发者的强大IDE&#xff0c;提供了丰富的功能来简化开发流程。然而&#xff0c;在使用过程中&#xff0c;开发者可能会遇到导入依赖库时出现的错误。本文将深入探讨PyCharm中导入依赖库报错的问题&#xff0c;并…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...