MySQL从入门到精通高级篇MySQL权限管理与控制
Posted 码农飞哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL从入门到精通高级篇MySQL权限管理与控制相关的知识,希望对你有一定的参考价值。
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
❤️ 2. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
😁 5. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
全网同名【码农飞哥】欢迎关注,个人VX: wei158556
文章目录
1. 简介
上篇文章我们介绍了MySQL中用户的创建,修改以及删除。这篇文章接着来学习mysql的权限管理与控制。
2. 环境
环境 | 版本 |
---|---|
Red Hat | 4.8.5-39 |
MySQL | 5.7 |
3. 权限管理
MySQL的权限管理简单的理解就是MySQL允许你做你权利以内的事情,不可以越界, 比如只允许你执行SELECT 操作,那么你就不能执行UPDATE 操作,只允许你从某台机器上连接MySQL,那么你就不能从除那台机器以外的其他机器连接MySQL。创建一个新账号之后,默认情况下只有information_schema数据库的权限,如果想要该用户可以操作其他数据库,这需要给用户分配特定的权限。
3.1. 权限列表
MySQL到底都有哪些权限呢?
mysql> show privileges;
GRANT和REVOKE语句中可以使用的权限如下:
权限 | user表中对应的列 | 权限的范围 |
---|---|---|
CREATE | Create_priv | 数据库、表或索引 |
Drop | Drop_priv | 数据库,表或视图 |
GRANTOPTION | Grant_priv | 数据库,表或存储过程 |
REFERENCES | Reference_priv | 数据库或表 |
EVENT | Event_priv | 数据库 |
ALTRE | Alter_priv | 数据库 |
DELETE | Delete_priv | 表 |
CREATE和DROP权限
,可以创建新的数据库和表、或删除(移掉)已有的数据库和表,如果将MySQL数据库中的DROP权限授予某用户,用户就可以删除MySQL访问权限保存的表。SELECT、INSERT、UPDATE和DELETE权限
允许在一个数据库现有的表上实施操作。SELECT权限
只有在它们真正从一个表中检索行时才被用到。INDEX权限
允许创建或删除索引、INDEX适用于已有的表,如果具有某个表的CREATE权限,就可以在CREATE TABLE语句中包括索引定义。ALTER权限
可以使用ALTER TABLE来更改表的结构和重新命名表。CREATE ROUTINE权限
用来创建保存的程序(函数和程序),ALTER ROUTINE权限用来更改和删除保存的程序,EXECUTE权限
用来执行保存的程序。GRANT权限
允许授权给其他用户,可用于数据库、表和程序。FILE权限
使用户可以使用LOAD DATA INFILE和SELECT … INTO OUTFILE语句读或写服务器上的文件,任何被授予FILE权限的用户都能读或写MySQL服务器上的任何文件。
MySQL权限如何分布
权限分布 | 可能的设置权限 |
---|---|
表权限 | SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、GRANT、REFERENCES、INDEX、ALTER |
列权限 | SELECT、INSERT、UPDATE、REFERENCES |
过程权限 | EXEUTE、ALTER ROUTINE、GRANT |
2.2. 授予权限的原则
权限控制主要是出于安全因素,因此需要遵循一下几个经验原则:
- 只授予满足需要的最小权限,防止用户干坏事,比如用户只需要查询,那就只给select权限就可以了。不需要给用户赋予UPDATE、INSERT或者DELETE权限。
- 创建用户的时候
限制用户的登录主机
,一般是限制成指定IP或内网IP段。 - 为每个用户
设置满足密码复杂度的密码
。 定期清理不需要的用户
,回收权限或删除用户。
2.3. 授予权限
给用户授权的方式有2种,分别是通过把角色赋予用户授权
和直接给用户授权
。用户是数据库的使用者,我们可以通过给用户授予访问数据库中资源的权限,来控制使用者对数据库的访问,消除安全隐患。
授权命令:
GRANT 权限1,权限2,...权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY '密码口令'];
授权时如果发现没有该用户,则会直接新建一个用户。
比如:
- 给zhang3用户用本地命令行方式,授予test这个库下所有表的查插删改的权限。
GRANT SELECT,INSERT,DELETE,UPDATE ON test.* TO zhang3 IDENTIFIED BY 'Abc123456@';
- 授予通过网络方式登录的zhangsan用户,对所有库所有表的全部权限,密码设为 Abc123456@,这里唯独不包括grant的权限。
GRANT ALL PRIVILEGES ON *.* TO zhangsan@'%' IDENTIFIED BY 'Abc123456@';
可以使用GRANT重复给用户添加权限,权限叠加
,比如你先给用户添加一个SELECT权限,然后 又给用户添加一个INSERT权限,那么该用户就同时拥有了SELECT和INSERT权限。
2.4. 查看权限
- 查看当前用户权限
SHOW GRANTS;
2. 查看某用户全局权限
SHOW GRANTS FOR 'user'@'主机地址'
建议大家尽量使用数据库自己的角色和用户机制来控制访问权限,不要轻易用root账号,因为root账号密码放在代码里面不安全,一旦泄露,数据库就会完全失去保护。
2.5. 收回权限
收回权限就是取消已经赋予用户的某些权限,收回用户不必要的权限可以在一定程度上保证系统的安全性。MySQL中使用REVOKE语句
取消用户的某些权限,使用REVOKE收回权限之后,用户账户记录将从db、host、tables_priv和column_priv表中删除,但是用户账户记录仍然在user表中保存(删除user表中的用户信息使用DROP USER语句)。
注意:在将用户账户从user表删除之前,应该收回相应的用户的所有权限。
收回命令:
REVOKE 权限1,权限2,...,权限n ON 数据库名称.表名称 FROM 用户名称@用户地址;
举例:
#收回全库全表的所有权限
REVOKE ALL PRIVILEGES ON *.* FROM zhang3@'%';
而且,MySQL的权限控制功能十分完善,应该尽量使用,可以提高效率,而且安全可靠。
3. 权限表
MySQL服务器通过权限表
来控制用户对数据库的访问,权限表存放在mysql数据库
中,MySQL数据库系统会根据这些权限表的内容为每个用户赋予相应的权限。这些权限表最重要的是user表、db表。除此之外,还有table_priv表
、column_priv表
和proc_priv表
。在MySQL启动时,服务器将这些数据库中权限信息读入内存。
表名 | 描述 |
---|---|
user | 用户账号及权限信息 |
global_grants | 动态全局授权 |
db | 数据库层级的权限 |
tables_priv | 表层级的权限 |
columns_priv | 列层级的权限 |
procs_priv | 存储过程和函数权限 |
proxics_priv | 代理用户的权限 |
下面以db表为例进行说明。
其中,zhang3这个账号拥有test库下的查删改插的权限。
总结
本文详细介绍了如何给用户分配权限以及收回权限
以上是关于MySQL从入门到精通高级篇MySQL权限管理与控制的主要内容,如果未能解决你的问题,请参考以下文章
MySQL从入门到精通高级篇MySQL表的存储引擎,InnoDB与MyISAM的对比
《黑马程序员 MySQL数据库入门到精通,从MySQL安装到MySQL高级MySQL优化全囊括》——学习笔记进阶篇