当前位置: 首页 > 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;并…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...