MySQL数据库 权限管理

Posted 我的紫霞辣辣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据库 权限管理相关的知识,希望对你有一定的参考价值。

权限管理

mysql库下的授权表

linux系统的用户作用是:

  1. 登陆系统
  2. 管理系统文件

mysql数据库管理软件用户的则作用是:

  1. 登陆MySQL数据库
  2. 管理库与表等数据库对象
  • mysql数据库管理软件将权限信息都存放于mysql库下,该库下有一系列授权表,权限信息都存放于这一系列表中,我们挑几个重点介绍一下

mysql库下的授权表及其放行权限的范围

  1、mysql.user    			针对所有数据、所有库下所有表、以及表下的所有字段
  2、msyql.db    			只针对某一数据库下的所有表,以及表下的所有字段
  3、tables_priv  	  		只针对某一张表、以及该表下的所有字段
  4、columns_priv    		只针对某一个字段

如下图,权限表放行权限的范围

 mysql.user:针对库db1,db2及其包含的所有
 db:只针对库例如db1,及其db1包含的所有
 tables_priv:只针对db1.table1,及其该表包含的所有
 columns_prive:只针对db1.table1.column1,只放行该字段

在这里插入图片描述

权限相关操作

创建\\查询\\删除用户

- 创建用户
# 允许客户端ip地址为192.168.15.51的主机使用nana用户的身份登陆数据库
create user "nana"@"192.168.15.51" identified by "123";
# 允许客户端ip地址的网段为192.168.15.*的主机使用nana的身份登陆数据库
create user "nana"@"192.168.15.%" identified by "123";
# 允许所有客户端使用nana的身份登陆数据库
create user "nana"@"%" identified by "123";

# 注意:使用create创建用户不指定用户权限,只对系统默认创建的基础库有增删改查权限。

- 查询用户
select user,host from mysql.user;

- 删除用户
# 删除用户名为空,主机名为localhost的用户
drop user ""@localhost;
# 删除用户名为nana,主机名为192.168.15.51的用户
drop user "nana"@192.168.15.51;

- 修改密码
方式一:在系统命令行进行操作
mysqladmin -uroot -p123 password "123456"

方式二:进行数据库内部进行操作
# password=password("123"),第一个password指的是表中的字段值,第二个password()指的是一个函数
update mysql.user set password=password('123') where user='root' and host='localhost';
flush privileges;			# 刷新授权

方式三:进行数据库内部进行操作,默认修改当前用户的密码
set password=password("123");

方式四:进入数据库内部进行授权修改密码
grant all on *.* to 'root'@'localhost' identified by '123';

授权

MySQL的权限,分别可以作用在多个层次上

  1. 所有库的所有表

  2. 单库下的所有表(最常用的授权级别)

  3. 单表下的所有列

  4. 单列授权

    例如:
    授予vip账号对某一表下所有列的查询权限
    而授予非vip账号对某一表下的某一列的查询权限
    
1.针对所有库的所有表:*.* 
# all增删改查全部操作,针对所有库下的所有表*.*,用户nana01允许所有主机登陆%
grant all on *.* to "nana01"@"%" identified by "123";
# 查看user表中用户nana01的权限全部设置成了Y,除了Grant_priv(创建用户授权)
select * from mysql.user\\G

2.针对某一数据库:db01.*
# all增删改查全部操作,针对db01库下的所有表db01.*,用户nana02允许所有主机登陆%
grant all on db01.* to "nana02"@"%" identified by "123";
# 查看db表中用户nana02的db01权限全部设置成了Y,除了Grant_priv(创建用户授权)
select * from mysql.db\\G

3.针对某一个表:db1.t1
# select查权限,针对db01库下的t1表db01.t1,用户nana03允许所有主机登陆%
grant select on db01.t1 to "nana03"@"%" identified by "123";
# 查看只针对某一张表、以及该表下的所有字段的权限
select * from mysql.tables_priv\\G

4.针对某一个字段
# 针对db01库下的t1表id,name,age字段具备查权限,针对age字段具备改权限,用户nana04只允许在localhost本机登陆
# 注意:update权限依赖于select权限
grant select (id,name,age),update (age) on db01.t1 to "nana04"@"localhost" identified by "123";
# 只针对某一个字段
select * from mysql.columns_priv\\G

all可以代表除了grant之外的所有权限,可以用with带上grant,授权一个超级管理员

# 创建一个跟root一样的超级管理员
grant all on *.* to nana@"%" identified by "123" with grant option;
# 查看mysql.user表中可以查到nana用户的Grant_priv也被设置为Y
select * from mysql.user\\G

其他权限

其他权限

  1. 针对存储过程的权限
  2. 针对函数的权限
create database db01;
create table blog(
id int primary key auto_increment,
name varchar(16),
sub_time datetime
);

1.作用在存储过程上
use db01;
delimiter //
create procedure p1()
BEGIN
    select * from blog;
    INSERT into blog(name,sub_time) values("xxx",now());
END //
delimiter ;

show procedure status; -- 查看到db1下有一个名为p1的存储过程 

grant execute on procedure db1.p1 to 'dba'@'localhost';

# 调用存储过程
mysql -udba -p
call db01.p1();		# 调用2次
call db01.p1();
+----+------+---------------------+
| id | name | sub_time            |
+----+------+---------------------+
|  1 | xxx  | 2021-07-10 18:55:26 |
+----+------+---------------------+

2.作用在函数上
delimiter //
create function f1(
    i1 int,
    i2 int)
returns int
BEGIN
    declare num int;
    set num = i1 + i2;
    return(num);
END //
delimiter ;

show function status; -- 查看到db1下有一个名为f1的函数

grant execute on function db1.f1 to 'dba'@'localhost';

# 调用函数
mysql -udba -p
select db01.f1(1,2);
+--------------+
| db01.f1(1,2) |
+--------------+
|            3 |
+--------------+

查看授权

# 查看当前用户登陆权限
show grants;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------+

# 查看其他用户的权限
show grants for "nana"@"%";
+--------------------------------------------------------------------------------------------------------------------------------+
| Grants for nana@%                                                                                                              |
+--------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'nana'@'%' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------------------+

撤销授权

# 撤销权限,只需要将用户nana的登陆权限设置成只允许本地登陆即可
grant all on *.* to nana@localhost;
# revoke 跟 grant 的语法差不多,只需要把关键字 "to" 换成 "from" 即可:
revoke all on *.* from dba@localhost;
revoke select on db1.* from 'nana'@'%';

扩展授权

max_queries_per_hour:一个用户每小时可发出的查询数量
max_updates_per_hour:一个用户每小时可发出的更新数量
max_connections_per_hour:一个用户每小时可连接到服务器的次数
max_user_connections:允许同时连接数量

# 创建用户
grant all on *.* to test@'%' identified by '123' with max_user_connections 2;
# 刷新权限表
flush privileges;

# 不要用-hlocalhost,它代表通过本地套接字链接 
mysql -utest -p123 -h 192.168.15.51		# 最多连接两个终端

不同角色的权限分配

针对普通用户

grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。

create database testdb;
# select, insert, update, delete也可以分开写
grant select, insert, update, delete on testdb.* to common_user@'%';
select host,user from mysql.db;
+------+-------------+
| host | user        |
+------+-------------+
| %    |             |
| %    |             |
| %    | common_user |
+------+-------------+

针对开发人员

grant 数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。

1、grant 创建、修改、删除 MySQL 数据表结构权限。
grant create on testdb.* to developer@'192.168.15.%';
grant alter  on testdb.* to developer@'192.168.15.%';
grant drop   on testdb.* to developer@'192.168.15.%';

2、grant 操作 MySQL 外键权限。
grant references on testdb.* to developer@'192.168.15.%';

3、grant 操作 MySQL 临时表权限。
grant create temporary tables on testdb.* to developer@'192.168.15.%';

4、grant 操作 MySQL 索引权限。
grant index on testdb.* to developer@'192.168.15.%';

5、grant 操作 MySQL 视图、查看视图源代码 权限。
grant create view on testdb.* to developer@'192.168.15.%';
grant show view on testdb.* to developer@'192.168.15.%';

6、grant 操作 MySQL 存储过程、函数 权限。
grant create routine on testdb.* to developer@'192.168.15.%'; -- now, can show procedure status
grant alter  routine on testdb.* to developer@'192.168.15.%'; -- now, you can drop a procedure
grant execute on testdb.* to developer@'192.168.15.%';	-- execute是执行权限

针对普通DBA

grant 普通 DBA 管理某个 MySQL 数据库的权限。

# 其中,关键字 “privileges” 可以省略。
grant all privileges on testdb.* to dba@'localhost';

针对高级DBA

grant 高级 DBA 管理 MySQL 中所有数据库的权限。

grant all on *.* to dba@'localhost';

在企业中权限的设定

开发人员说:请给我开一个用户

  1. 首先进行沟通
    1.你需要对哪些库、表进行操作
    2.你从哪里连接过来
    3.用户名有没有要求
    4.密码要求
    5.你要使用多长时间
    6.发邮件

  2. 一般给开发创建用户权限,建议不给delete权限:

    grant select,update,insert on *.* to "nana"@'192.168.15.%'' identified by '123';
    

以上是关于MySQL数据库 权限管理的主要内容,如果未能解决你的问题,请参考以下文章

常见的mysql权限设置

gitlab 权限说明

MySQL的用户管理与权限管理

MySQL的用户管理与权限管理

MySQL用户及权限管理

springboot+vue+mysql代码生成 集成系统管理