MySQL用户授权、收回权限与查看权限

ops/2025/1/23 15:39:56/

【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客


《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com)

MySQL9数据库技术_夏天又到了的博客-CSDN博客

MySQL新建和删除普通用户-CSDN博客

13.3.2  授权

授权就是为某个用户授予权限。合理的授权可以保证数据库安全。MySQL中可以使用GRANT语句为用户授予权限。授予的权限可以分为以下5个层级:

1. 全局层级

全局权限适用于一个给定服务器中的所有数据库。这些权限存储在MySQL.user表中。GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤销全局权限。

2. 数据库层级

数据库权限适用于一个给定数据库中的所有目标。这些权限存储在MySQL.db和MySQL.host表中。GRANT ALL ON db_name.和REVOKE ALL ON db_name.*只授予和撤销数据库权限。

3. 表层级

表权限适用于一个给定表中的所有列。这些权限存储在MySQL.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤销表权限。

4. 列层级

列权限适用于一个给定表中的单一列。这些权限存储在MySQL.columns_priv表中。当使用REVOKE时,必须指定与被授权列相同的列。

5. 子程序层级

CREATE ROUTINE、ALTER ROUTINE、EXECUTE和GRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。除了CREATE ROUTINE之外,这些权限还可以被授予子程序层级,并存储在MySQL.procs_priv表中。CREATE ROUTINE、ALTER ROUTINE、EXECUTE和GRANT权限用于管理已存储的子程序。这些权限可以被授予为全局层级(GLOBAL)和数据库层级(DATABASE)。

除了CREATE ROUTINE 权限外,其他权限(ALTER ROUTINE、EXECUTE和GRANT)还可以被授予子程序层级(PROCEDURE),并存储在MySQL.procs_priv表中。

在MySQL中,要使用GRANT或REVOKE,必须拥有GRANT OPTION权限,并且必须用于正在授予或撤销的权限。GRANT的语法如下:

GRANT priv_type [(columns)] [, priv_type [(columns)]] ...ON [object_type]  table1, table2,…, tablenTO user  [WITH GRANT OPTION]object_type = TABLE  |  FUNCTION  |  PROCEDURE

其中,priv_type参数表示权限类型;columns参数表示权限作用于哪些列上,不指定该参数,表示作用于整张表;table1,table2,…,tablen表示授予权限的列所在的表;object_type指定授权作用的对象类型包括TABLE(表)、FUNCTION(函数)和PROCEDURE(存储过程),当从旧版本的MySQL升级时,要使用object_tpye子句,必须升级授权表;user参数表示用户账户,由用户名和主机名构成,形式是“'username'@'hostname'”。

WITH关键字后可以跟一个或多个with_option参数。这个参数有5个选项,意义如下:

(1)GRANT OPTION:被授权的用户可以将这些权限赋予别的用户。

(2)MAX_QUERIES_PER_HOUR count:设置每小时可以执行count次查询。

(3)MAX_UPDATES_PER_HOUR count:设置每小时可以执行count次更新。

(4)MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立count个连接。

(5)MAX_USER_CONNECTIONS count:设置单个用户可以同时建立count个连接。

【例13.9】创建一个新的用户grantUser。使用GRANT语句对用户grantUser赋予所有的表进行数据的查询、插入权限,并授于GRANT权限。GRANT语句及其执行结果如下:

MySQL> CREATE USER 'grantUser'@'localhost' IDENTIFIED BY 'mypass';MySQL> GRANT SELECT,INSERT ON *.* TO 'grantUser'@'localhost' WITH GRANT OPTION;Query OK, 0 rows affected (0.03 sec)

结果显示执行成功。使用SELECT语句查询用户grantUser的权限:

MySQL> SELECT Host,User,Select_priv,Insert_priv, Grant_priv FROM mysql.user where user='grantUser';
+-----------+------------+-------------+--------------+-------------+
| Host      | User       | Select_priv | Insert_priv  | Grant_priv  |
+-----------+------------+-------------+--------------+-------------+
| localhost | grantUser  | Y           | Y            | Y           |
+-----------+------------+-------------+--------------+-------------+
1 row in set (0.00 sec)

查询结果显示用户grantUser被创建成功,并被赋予SELECT、INSERT和GRANT权限,其相应字段值均为“Y”。被授予GRANT权限的用户可以登录MySQL并创建其他用户账户。

13.3.3  收回权限

收回权限就是将赋予用户的某些权限取消。收回用户不必要的权限,可以在一定程度上保证系统的安全性。MySQL中使用REVOKE语句取消用户拥有的某些权限。使用REVOKE收回权限之后,用户账户的记录将从db、host、tables_priv和columns_priv表中删除,但是仍然在user表中保存(删除user表中的账户记录,要使用DROP USER语句,在13.2.3节已经介绍)。

在将用户账户从user表中删除之前,应该收回相应用户的所有权限。REVOKE语句有两种语法格式。

(1)第一种是收回所有用户的所有权限,用于取消已命名用户的所有全局层级、数据库层级、表层级和列层级的权限,具体如下:

REVOKE ALL PRIVILEGES, GRANT OPTIONFROM 'user'@'host' [, 'user'@'host' ...]

REVOKE语句必须和FROM语句一起使用。FROM语句指明需要收回权限的账户。

(2)第二种为长格式的REVOKE语句,基本语法如下:

REVOKE priv_type [(columns)] [, priv_type [(columns)]] ...ON  table1, table2,…, tablenFROM 'user'@'host'[, 'user'@ 'host' ...]

该语法收回指定的权限。其中,priv_type参数表示权限类型;columns参数表示权限作用于哪些列上,如果不指定该参数,则表示作用于整张表;table1,table2,…,tablen表示从哪张表中收回权限;'user'@'host'参数表示用户账户,由用户名和主机名构成。

要使用REVOKE语句,必须拥有MySQL数据库的全局CREATE USER权限或UPDATE权限。

【例13.11】使用REVOKE语句取消用户grantUser的查询权限。REVOKE语句及其执行结果如下:

MySQL> REVOKE Select ON *.* FROM 'grantUser'@'localhost';Query OK, 0 rows affected (0.00 sec)

执行结果显示执行成功。使用SELECT语句查询用户grantUser的权限:

mysql> SELECT Host,User,Select_priv,Insert_priv,Grant_priv FROM MySQL.user where user='grantUser';
+-----------+-----------+-------------+-------------+------------+
| Host      | User      | Select_priv | Insert_priv | Grant_priv |
+-----------+-----------+-------------+-------------+------------+
| localhost | grantUser | N           | Y           | Y          |
+-----------+-----------+-------------+-------------+------------+

查询结果显示用户grantUser的Select_priv字段值为“N”,说明SELECT权限已经被收回。

13.3.4  查看权限

使用SHOW GRANTS语句可以显示指定用户的权限信息,基本语法格式如下:

SHOW GRANTS FOR 'user'@ 'host' ;

其中,user表示登录用户的名称,host表示登录的主机名称或者IP地址。在使用该语句时,要确保指定的用户名和主机名都要用单引号引起来,并使用“@”符号将两个名字分隔开。

【例13.12】使用SHOW GRANTS语句查询用户grantUser的权限信息。SHOW GRANTS语句及其执行结果如下:

MySQL> SHOW GRANTS FOR 'grantUser'@'localhost';
+------------------------------------------------------------------+
| Grants for grantUser@localhost                                   |
+------------------------------------------------------------------+
| GRANT INSERT ON *.* TO `grantUser`@`localhost` WITH GRANT OPTION |
+------------------------------------------------------------------+

返回的结果显示了grantUser表中的账户信息。接下来的行以“GRANT INSERT ON”关键字开头,表示用户被授予了INSERT权限;*.*表示INSERT权限作用于所有数据库的所有数据表。

在这里,只是定义了个别的用户权限,GRANT可以显示更加详细的权限信息,包括全局级的和非全局级的权限,如果表层级或者列层级的权限被授予用户,那么它们也能在结果中显示出来。

在前面创建用户时,查看新建的账户使用的是SELECT语句,也可以通过SELECT语句查看user表中的各个权限字段以确定用户的权限信息,其基本语法格式如下:

SELECT privileges_list FROM user WHERE user='username', host= 'hostname';

其中,privileges_list为想要查看的权限字段,可以为Select_priv、Insert_priv等。读者可以根据需要选择要查询的字段。


http://www.ppmy.cn/ops/152499.html

相关文章

gitlabgit分支合并

在GitLab中,分支合并是一个非常常见的操作,可以将一个分支的改动合并到另一个分支中。下面我将为你介绍一下GitLab中分支合并的具体步骤。 首先,进入你的项目仓库页面,在页面上方的导航栏中点击”Repository”,然后选择…

2025年——【寒假】自学黑客计划(网络安全)

CSDN大礼包:👉基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&…

三篇物联网漏洞挖掘综述

由于物联网设备存在硬件资源受限、硬件复杂异构, 代码、文档未公开的问题, 物联网设备的漏洞挖掘存在较大的挑战: 硬件资源受限性: 通用动态二进分析技术需要在运行程序外围实施监控分析。由于物联网设备存储资源(存储)的受限性,…

力扣动态规划-7【算法学习day.101】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关…

ChatGPT Prompt 编写指南

一、第一原则:明确的意图​ 你需要明确地表达你的意图和要求,尽可能具体、描述性、详细地描述所需的上下文、你期望的结果等。你的要求越明确,越有希望获得你想要的答案。​ 糟糕的案例 ❌​ ​ 写一首关于 OpenAI 的诗。​ ​ 更好的案…

“模板”格式化发布新创诗(为《诗意 2 0 2 5》贡献力量)

预置MarkDown&Html文本,脚本读取f-string模板完成录入嵌套。 (笔记模板由python脚本于2025-01-22 19:19:58创建,本篇笔记适合喜欢分享的达人的coder翻阅) 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验,而不…

标签编码和独热编码对线性模型和树模型的影响

本人主页:机器学习司猫白 机器学习专栏:机器学习实战 PyTorch入门专栏:PyTorch入门 深度学习实战:深度学习 ok,话不多说,我们进入正题吧 概述 相信大家在建模中经常会用到标签编码和独热编码,这…

Redis和MongoDB的区别

前言 在项目选型阶段,MongoDB被选中主要是基于其处理大规模数据集的能力,而当时并未深入探讨其他替代方案。此前,Redis被用于管理少量但访问频繁的热数据。目前,项目采用MongoDB存储百万级数据,预计未来数据量将增长至…