权限列表
MySQL到底都有哪些权限呢?
mysql> show privileges;
(1) CREATE和DROP权限 ,可以创建新的数据库和表,或删除(移掉)已有的数据库 和表。如果将MySQL数据库中的DROP权限授予某用户,用户就可以删除MySQL
访问权限保存的数据库。
(2) SELECT、INSERT、UPDATE和DELETE权限 允许在一个数据库现有的表上实施操
作。
(3) SELECT权限 只有在它们真正从一个表中检索行时才被用到。
(4) INDEX权限 允许创建或删除索引,INDEX适用于已有的表。如果具有某个表的
CREATE权限,就可以在CREATE TABLE语句中包括索引定义。
(5) ALTER权限 可以使用ALTER TABLE来更改表的结构和重新命名表。
(6) CREATE ROUTINE权限 用来创建保存的程序(函数和程序),ALTER ROUTINE权
限用来更改和删除保存的程序, EXECUTE权限 用来执行保存的程序。
(7) GRANT权限 允许授权给其他用户,可用于数据库、表和保存的程序。
(8) FILE权限 使用 户可以使用LOAD DATA INFILE和SELECT … INTO OUTFILE语句读
写服务器上的文件,任何被授予FILE权 限的用户都能读或写MySQL服务器上的任
何文件(说明用户可以读任何数据库目录下的文件,因为服务器可以访问这些文
件)。
授予权限的原则
权限控制主要是出于安全因素,因此需要遵循以下几个 经验原则 :
1、只授予能 满足需要的最小权限 ,防止用户干坏事。比如用户只是需要查询,那就只给
select权限就可 以了,不要给用户赋予update、insert或者delete权限。
2、创建用户的时候 限制用户的登录主机 ,一般是限制成指定IP或者内网IP段。
3、为每个用户 设置满足密码复杂度的密码 。
4、定期清理不需要的用户 ,回收权限或者删除用户。
授予权限
给用户授权的方式有 2 种,分别是通过把 角色赋予用户给用户授权 和 直接给用户授权 。用户是数据库的使用者,我们可以通过给用户授予访问数据库中资源的权限,来控制使用者对数据库的访问,消除安全隐患。
授权命令:
GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY ‘密码口令’];
该权限如果发现没有该用户,则会直接新建一个用户。
比如:
给huan用户用本地命令行方式,授予dbtest1这个库下的所有表的插删改查的权限。
GRANT SELECT,INSERT,DELETE,UPDATE ON dbtest1.* TO hao@'%' ;
# 有百分号的时候,要用' ' 给包起来!
GRANT SELECT,INSERT,DELETE,UPDATE ON dbtest.* TO huan@localhost ;
授予通过网络方式登录的hao用户 ,对所有库所有表的全部权限,密码设为123。注意这里唯独不包括grant的权限
GRANT ALL PRIVILEGES ON *.* TO hao@'%' IDENTIFIED BY '123';
我们在开发应用的时候,经常会遇到一种需求,就是要根据用户的不同,对数据进行横向和纵向的分组。
- 所谓横向的分组,就是指用户可以接触到的数据的范围,比如可以看到哪些表的据;
- 所谓纵向的分组,就是指用户对接触到的数据能访问到什么程度,比如能看、能改,甚至是删除。
查看权限
查看当前用户权限
查看某用户的全局权限 ```plsql SHOW GRANTS FOR ‘user’@’主机地址’;SHOW GRANTS; # 或 SHOW GRANTS FOR CURRENT_USER; # 或 SHOW GRANTS FOR CURRENT_USER();
举例:查看hao用户权限
show grants for ‘hao’@’%’;
举例:查看huan用户权限
show grants for ‘huan’@’localhost’;

<a name="Oy1EU"></a>
# 收回权限
收回权限就是取消已经赋予用户的某些权限。**收回用户不必要的权限可以在一定程度上保证系统的安全性。**MySQL中使用 REVOKE语句 取消用户的某些权限。使用REVOKE收回权限之后,用户账户的记录将从db、host、tables_priv和columns_priv表中删除,但是用户账户记录仍然在user表中保存(删除user表中的账户记录使用DROP USER语句)。<br /> <br />**注意:在将用户账户从user表删除之前,应该收回相应用户的所有权限。**
**收回权限命令**
```plsql
REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM 用户名@用户地址;
举例
#收回全库全表的所有权限
REVOKE ALL PRIVILEGES ON *.* FROM hao@'%';
#收回mysql库下的所有表的插删改查权限
REVOKE SELECT,INSERT,UPDATE,DELETE ON mysql.* FROM huan@localhost;
注意: 须用户重新登录后才能生效
总结:
有一些程序员喜欢使用root来访问数据库,完全把权限控制放在应用层面上,也是可以的,但建议是,尽量使用数据库用自己的角色和用户机制来访问权限,不要轻易用root账号,因为root账号密码放在代码里不安全,一旦泄露,数据库就会失去保护
而且MySQL的权限控制功能十分完善,应该尽量利用,可以提高效率,而且安全可靠。
权限表
MySQL服务器通过权限表来控制用户对数据库的访问,权限表放在mysql数据库中,MySQL数据库系统会根据这些权限表的内容为每个用户赋予相应的权限,这些权限最重要的是user表,db表,除此之外,还有table_priv表,column_priv表和proc_priv表等,在MySQL启动时,服务器将这些数据库表中的权限信息的内容读入内存!
user表
user表是MySQL中最重要的一个权限表, 记录用户账号和权限信息 ,有49个字段。如下图:
这些字段可以分成4类,分别是范围列(或用户列)、权限列、安全列和资源控制列。
1.范围列(或用户列)
- host : 表示连接类型
- % 表示所有远程通过 TCP方式的连接
- IP 地址 如 (192.168.1.2、127.0.0.1) 通过制定ip地址进行的TCP方式的连接
- 机器名 通过制定网络中的机器名进行的TCP方式的连接
- ::1 IPv6的本地ip地址,等同于IPv4的 127.0.0.1
- localhost 本地方式通过命令行方式的连接 ,比如mysql -u xxx -p xxx 方式的连接。
- user : 表示用户名,同一用户通过不同方式链接的权限是不一样的。
- password : 密码
- 所有密码串通过 password(明文字符串) 生成的密文字符串。MySQL 8.0 在用户管理方面增加了角色管理,默认的密码加密方式也做了调整,由之前的 SHA1 改为了 SHA2 ,不可逆 。同时加上 MySQL 5.7 的禁用用户和用户过期的功能,MySQL 在用户管理方面的功能和安全性都较之前版本大大的增强了。
- mysql 5.7 及之后版本的密码保存到 authentication_string 字段中不再使用password 字段。
2. 权限列
- Grant_priv字段
- 表示是否拥有GRANT权限
- Shutdown_priv字段
- 表示是否拥有停止MySQL服务的权限
- Super_priv字段
- 表示是否拥有超级权限
- Execute_priv字段
- 表示是否拥有EXECUTE权限。拥有EXECUTE权限,可以执行存储过程和函数。
- Select_priv , Insert_priv等
- 为该用户所拥有的权限。
3. 安全列
**安全列只有6个字段,其中两个是ssl相关的(ssl_type、ssl_cipher),用于 加密 ;两个是x509相关的(x509_issuer、x509_subject),用于 标识用户 ;另外两个Plugin字段用于 验证用户身份 的插件,该字段不能为空。如果该字段为空,服务器就使用内建授权验证机制验证用户身份。
4. 资源控制列
资源控制列的字段用来 限制用户使用的资源 ,包含4个字段,分别为:
①max_questions,用户每小时允许执行的查询操作次数;
②max_updates,用户每小时允许执行的更新操作次数;
③max_connections,用户每小时允许执行的连接操作次数; ④max_user_connections,用户允许同时建立的连接次数。**
查看字段:
DESC mysql.user;
查看用户, 以列的方式显示数据:
SELECT * FROM mysql.user \G;
查询特定字段:
SELECT host,user,authentication_string,select_priv,insert_priv,drop_priv FROM mysql.user;
db表
使用DESCRIBE查看db表的基本结构:
DESCRIBE mysql.db;
1. 用户列 db表用户列有3个字段,分别是Host、User、Db。这3个字段分别表示主机名、用户名和数据库名。表示从某个主机连接某个用户对某个数据库的操作权限,这3个字段的组合构成了db表的主键。
2. 权限列
Create_routine_priv和Alter_routine_priv这两个字段决定用户是否具有创建和修改存储过程的权限。
tables_priv表和columns_priv表
tables_priv表用来 对表设置操作权限 ,columns_priv表用来对表的 某一列设置权限 。tables_priv表和columns_priv表的结构分别如图:
desc mysql.tables_priv;
tables_priv表有8个字段,分别是Host、Db、User、Table_name、Grantor、Timestamp、Table_priv和 Column_priv,各个字段说明如下:
- Host 、 Db 、 User 和 Table_name 四个字段分别表示主机名、数据库名、用户名和表名。
- Grantor表示修改该记录的用户。
- Timestamp表示修改该记录的时间。
- Table_priv 表示对象的操作权限。包括Select、Insert、Update、Delete、Create、Drop、Grant、 References、Index和Alter。
- Column_priv字段表示对表中的列的操作权限,包括Select、Insert、Update和References。
desc mysql.columns_priv;
procs_priv表
procs_priv表可以对 存储过程和存储函数设置操作权限 ,表结构如图:
desc mysql.procs_priv;

