mysql角色授权模式案例参考

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 介绍关于mysql通过角色来授权账号信息的方式

用户场景:角色授权与权限分配

前提条件( >= mysql5.7)

角色权限分配参考示意图

image.png

查看当前用户相关权限信息
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
SHOW GRANTS for 【指定用户】;

角色分配与授权相关操作介绍

mysql 权限介绍

全局层级

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

数据库层级

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

表层级

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

列层级

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

子程序层级

CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了CREATE ROUTINE外,这些权限可以被授予为子程序层级,并存储在mysql.procs_priv表中。

数据库权限介绍

数据库权限

下表列出了可在数据库级别授予的权限。您还可以在数据库级别授予所有表和函数特权。数据库上的表和函数特权适用于该数据库中的所有表或函数,包括以后创建的表或函数。

要为数据库设置特权,请指定用于priv_level的数据库,或仅用于指定缺省数据库。db_name.* *

特权 描述
CREATE 在为数据库授予特权时,使用CREATE DATABASE语句创建数据库。您可以授予对尚不存在的数据库的特权。这还会授予对数据库中所有表的特权。CREATE CREATE
CREATE ROUTINE 使用 CREATE PROCEDURE 和 CREATE FUNCTION语句创建存储程序。
CREATE TEMPORARY TABLES 使用 CREATE TEMPORARY TABLE 语句创建临时表。此权限允许写入和删除这些临时表
DROP 在授予数据库特权时,使用DROP DATABASE语句删除数据库。这还会授予对数据库中所有表的特权。DROP
EVENT 创建、删除和更改 s。EVENT
GRANT OPTION 授予数据库权限。您只能授予您拥有的权限。
LOCK TABLES 使用LOCK TABLES语句获取显式锁;您还需要对表具有权限,以便锁定它。SELECT
表权限介绍

表权限

特权 描述
ALTER 使用 ALTER TABLE 语句更改现有表的结构
CREATE 使用 CREATE TABLE 语句创建表。您可以授予对尚不存在的表的权限。CREATE
CREATE VIEW 使用CREATE_VIEW语句创建视图。
DELETE 使用DELETE语句从表中删除行。
DELETE HISTORY 使用DELETE HISTORY语句从表中删除历史行。在运行SHOW GRANTS时显示为在MariaDB 10.3.15MariaDB 10.4.5 (MDEV-17655)之前运行,或者在运行 SHOW 权限直到MariaDB 10.5.2、MariaDB 10.4.13MariaDB 10.3.23 (MDEV-20382)时显示。来自MariaDB 10.3.4.从MariaDB 10.3.5中,如果用户具有此权限但不是此权限,则运行mysql_upgrade也将授予此权限。DELETE VERSIONING ROWS SUPER
DROP 使用 DROP TABLE 语句删除表或使用 DROP VIEW 语句删除视图。还需要执行截断表语句。
GRANT OPTION 授予表权限。您只能授予您拥有的权限。
INDEX 使用 CREATE INDEX 语句在表上创建索引。如果没有该特权,则在创建表时,如果您具有权限,则在创建表时仍可以创建索引;如果您具有该权限,则可以使用ALTER TABLE语句创建索引。INDEX CREATE ALTER
INSERT 使用INSERT语句向表中添加行。也可以在单个列上设置权限;有关详细信息,请参阅下面的列权限INSERT
REFERENCES 闲置。
SELECT 使用SELECT语句从表中读取数据。也可以在单个列上设置权限;有关详细信息,请参阅下面的列权限SELECT
SHOW VIEW 显示CREATE VIEW语句以使用SHOW CREATE VIEW语句创建视图。
TRIGGER 执行与更新的表关联的触发器,执行CREATE TRIGGERDROP TRIGGER语句。您仍然可以看到触发器。
UPDATE 使用UPDATE语句更新表中的现有行。 语句通常包含仅更新某些行的子句。您必须对表或子句的相应列具有特权。也可以在单个列上设置权限;有关详细信息,请参阅下面的列权限UPDATE WHERE SELECT WHERE UPDATE
列权限介绍

列权限

可以为表的各个列设置某些表权限。要使用列权限,请显式指定表,并在权限类型后提供列名列表。例如,以下语句将允许用户读取员工的姓名和职位,但不允许读取同一表中的其他信息,如工资。

GRANT SELECT (name, position) on Employee to 'jeffrey'@'localhost';
特权 描述
INSERT (column_list) 使用INSERT语句添加指定列中值的行。如果您只有列级特权,则必须指定要在语句中设置的列。所有其他列将设置为其默认值,或 。INSERTINSERTNULL
REFERENCES (column_list) 闲置。
SELECT (column_list) 使用SELECT语句读取列中的值。您不能访问或查询您没有权限的任何列,包括 、 、 和 子句。SELECTWHEREONGROUP BYORDER BY
UPDATE (column_list) 使用UPDATE语句更新现有行的列中的值。 语句通常包含仅更新某些行的子句。您必须对表或子句的相应列具有特权。UPDATEWHERESELECTWHERE
功能权限介绍

功能权限

特权 描述
ALTER ROUTINE 使用 ALTER FUNCTION 语句更改存储函数的特征。
EXECUTE 使用存储的函数。您需要对函数访问的任何表或列具有权限。SELECT
GRANT OPTION 授予函数权限。您只能授予您拥有的权限。
过程权限介绍

过程权限

特权 描述
ALTER ROUTINE 使用 ALTER PROCEDURE 语句更改存储过程的特征。
EXECUTE 使用CALL语句执行存储过程。调用过程的权限可能允许您执行否则无法执行的操作,例如在表中插入行。
GRANT OPTION 授予过程权限。您只能授予您拥有的权限。
代理权限介绍

代理权限

特权 描述
PROXY 允许一个用户成为另一个用户的代理。

该权限允许一个用户代理为另一个用户,这意味着他们的权限更改为代理用户的权限,并且 CURRENT_USER()函数返回代理用户的用户名。PROXY

该权限仅适用于支持它的身份验证插件。默认mysql_native_password身份验证插件不支持代理用户。PROXY

pam身份验证插件是 MariaDB 附带的唯一一个目前支持代理用户的插件。该权限通常与pam身份验证插件一起使用,以启用与 PAM 的用户和组映射PROXY

例如,要向使用pam身份验证插件进行身份验证的匿名帐户授予权限,可以执行以下操作:PROXY

CREATE USER 'dba'@'%' IDENTIFIED BY 'strongpassword'; GRANT ALL PRIVILEGES ON . TO 'dba'@'%' ; CREATE USER ''@'%' IDENTIFIED VIA pam USING 'mariadb'; GRANT PROXY ON 'dba'@'%' TO ''@'%';

仅当授予者还具有特定用户帐户的权限,并且定义了该权限时,用户帐户才能授予该特权。例如,以下示例失败,因为授予者根本没有该特定用户帐户的权限:PROXY PROXY WITH GRANT OPTION PROXY

资料来源: 格兰特 - 玛丽亚数据库知识库 (mariadb.com)


mysql 所在服务器上登录给主账号 root 授权(如不需要远程授权,此步骤可以忽略)
-- % 替换成ip,就是指定的ip才能操作 
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'dev-whbj@WHBJ' WITH GRANT OPTION;

-- 这个必须用 root@localhost 从本机登录后先授权,不然后续的操作,都无法远程操作代理角色
GRANT PROXY ON ''@'' TO 'root'@'%' WITH GRANT OPTION;

-- 刷新权限
FLUSH PRIVILEGES;
准备测试库
-- 创建测试库 ,请勿以 test_ 开头创建数据库,不然默认授权给所有用户,授权的相关操作相当于无效
CREATE DATABASE tst_db;
-- 创建测试表
CREATE TABLE `tst_db`.`test_1` (`id` int NOT NULL, `txt` text NOT NULL,   PRIMARY KEY (`id`) );
创建用户(角色)
-- 创建两个用户,其中一个用户可以当作是角色
create USER 'db_role1';  -- 测试角色
create USER 'user_1'; -- 测试用户

-- 查看用户信息
select * from mysql.user;
角色授权
-- 角色授权给用户
grant proxy on 'db_role1' to 'user_1';

-- 将权限授权给角色
-- 使用 * 时,授权数据库层级权限
grant select,insert,update,delete,create on tst_db.* to db_role1;
-- 通过数据库层面查看数据库权限信息
select * from mysql.db where User='db_role1';

-- 指定表名时,授予 mysql.tables_priv 表级权限
grant select,insert,update,delete on tst_db.test_1 to db_role1;
-- 查看用户表权限信息
select * from mysql.tables_priv where User='db_role1';
权限立即生效
-- 立即启用修改
flush  privileges ;

权限回收相关介绍

收回角色权限时,需要根据 全局权限 、数据库权限、表权限、 列权限 、子程序权限 5个方面的权限查询后,收回对应的权限,避免权限回收失败,导致权限仍然生效的尴尬情况
-- 查看用户的所有权限 (会显示所有的授权语句)
-- 来源: https://mariadb.com/kb/en/show-grants/
SHOW GRANTS for db_role1;
-- 参照顶部的 mysql 权限介绍,进行权限查询和回收
-- 查询全局权限
select * from mysql.user where  User='db_role1';
-- 回收用户的全局权限
REVOKE ALL ON *.* FROM db_role1;

-- 数据库权限
select * from mysql.db where User='db_role1';
-- 回收用户的数据库权限
REVOKE ALL ON tst_db.* FROM db_role1;

-- 表级权限
select * from mysql.tables_priv where User='db_role1';
-- 回收表级权限(同时也会进行列权限、子程序权限 回收)
REVOKE ALL ON tst_db.test_1 FROM db_role1;

-- 列权限
select * from mysql.columns_priv where User='db_role1';

--  回收列权限,可指定相应的列权限进行回收,使用All时,回包括表权限进行回收
REVOKE ALL ON tst_db.test_1 FROM db_role1;

-- 子程序权限
select * from mysql.procs_priv where User='db_role1';

参考来源: 撤销 - 玛丽亚数据库知识库 (mariadb.com)

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
13天前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
38 3
|
13天前
|
SQL 关系型数据库 MySQL
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
|
13天前
|
SQL 关系型数据库 MySQL
案例剖析,MySQL共享锁引发的死锁问题!
案例剖析,MySQL共享锁引发的死锁问题!
|
13天前
|
消息中间件 关系型数据库 MySQL
大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka
大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka
63 0
|
1月前
|
监控 关系型数据库 MySQL
zabbix agent集成percona监控MySQL的插件实战案例
这篇文章是关于如何使用Percona监控插件集成Zabbix agent来监控MySQL的实战案例。
37 2
zabbix agent集成percona监控MySQL的插件实战案例
|
2月前
|
数据可视化 关系型数据库 MySQL
【MySQL】MySQL8.0 创建用户及授权 - 看这篇就足够了
本文介绍了在MySQL 8.0+版本中创建和管理用户的详细步骤,包括通过命令行进入MySQL、创建数据库、用户及授权等操作,并提供了具体命令示例。适合初学者参考学习,帮助实现系统的权限管理和安全控制。
841 2
【MySQL】MySQL8.0 创建用户及授权 - 看这篇就足够了
|
2月前
|
SQL 关系型数据库 MySQL
MySQL的match WITH QUERY EXPANSION 模式是什么?如何使用?
【8月更文挑战第29天】MySQL的match WITH QUERY EXPANSION 模式是什么?如何使用?
45 4
|
2月前
|
存储 关系型数据库 MySQL
MySQL bit类型增加索引后查询结果不正确案例浅析
【8月更文挑战第17天】在MySQL中,`BIT`类型字段在添加索引后可能出现查询结果异常。表现为查询结果与预期不符,如返回错误记录或遗漏部分数据。原因包括索引使用不当、数据存储及比较问题,以及索引创建时未充分考虑`BIT`特性。解决方法涉及正确运用索引、理解`BIT`的存储和比较机制,以及合理创建索引以覆盖各种查询条件。通过`EXPLAIN`分析执行计划可帮助诊断和优化查询。
|
3月前
|
缓存 监控 关系型数据库
MySQL PXC 集群死锁分析案例
前不久一个系统死锁导致部分业务受到影响,今次补上详细的节点日志分析过程。
74 1
|
3月前
|
存储 缓存 关系型数据库
MySQL8 中文参考(二十一)(5)
MySQL8 中文参考(二十一)
68 3