MySQL权限控制
概述
-
身份认证模块,即MySQL客户端通过指定用户名,密码,主机名来连接MySQL服务器,主要是认证给定的用户是否有权限连接MySQL服务器,而权限控制模块主要用于控制已经通过身份认证的用户对数据库、数据库表、数据表的列的访问权限。针对数据库,数据表和数据表的列的访问控制主要在mysql数据库的user表进行定义,如下是user表的完整字段集合:
| Host | User | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | Create_tablespace_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections | max_user_connections | plugin | authentication_string | password_expired | password_last_changed | password_lifetime | account_locked |
-
在MySQL中一个用户是由用户名user和访问主机host唯一确定的,即[email protected]唯一确定,以下分析所用的test_user用户是指’test_user’@’%'这个用户。
权限控制
1. 查看给定用户的权限
命令为SHOW GRANTS FOR,如以下test_user为新增的用户,没有赋予数据库相关的访问权限,如下USAGE表示没有权限。
```
mysql> show grants for 'test_user'@'%';
+---------------------------------------+
| Grants for [email protected]% |
+---------------------------------------+
| GRANT USAGE ON *.* TO 'test_user'@'%' |
+---------------------------------------+
1 row in set (0.00 sec)
```
2. 添加对数据库,数据表的访问权限:
-
权限枚举主要为:针对DML相关的(SELECT,UPDATE,DELETE,INSERT),针对DLL相关的(CREATE、ALTER、DROP),以及其他权限:CREATE USER,FILE,PROCESS,RELOAD,REPLICATION CLIENT,REPLICATION SLAVE,SHOW DATABASES,SHUTDOWN,SUPER 和 USAGE。
-
在以下所列权限当中,从上到下,上的可以覆盖下的权限,即Global权限优先于Database权限,如果某个用户有全局权限,而Database权限设置对该用户无效,即即使该用户在Database级别没有设置可以访问指定数据库的表的权限,则该用户也是可以访问的。
-
Global全局权限,即对所有数据库的所有表的所有字段都有效的权限:“ * .* ”,其中左边为数据库通配符,右边为数据表通配符。
mysql> GRANT SELECT,UPDATE,DELETE,INSERT ON *.* TO 'test_user'@'%'; Query OK, 0 rows affected (0.01 sec)
-
Database数据库权限,即针对指定数据库的所有数据表的所有字段有效的权限:如下为给test_user这个用户赋予对easy_web这个数据库所有表的ALTER权限。
mysql> GRANT ALTER ON easy_web.* TO 'test_user'@'%'; Query OK, 0 rows affected (0.00 sec)
-
Table数据表权限:即针对指定数据表的所有字段有效的权限:如下为给test_user在easy_web的t_user表的所有字段添加索引的权限。
mysql> GRANT INDEX ON easy_web.t_user TO 'test_user'@'%'; Query OK, 0 rows affected (0.00 sec)
-
Column数据列的权限:即只指定指定数据库的指定表的指定列的权限:如下为只给test_user在easy_web数据库的t_user表对id, name列的SELECT的权限,但是没有INSERT插入数据到这两个字段的权限。
mysql> GRANT SELECT(id,name) ON easy_web.t_user TO 'test_user'@'%'; Query OK, 0 rows affected (0.00 sec)
-
-
除了在GRANT上指定具体的权限枚举之外,还可以通过ALL来指定对应级别上面的所有权限。如下为给test_user指定对easy_web数据库内的所有表的所有操作权限:
mysql> GRANT ALL ON easy_web.* TO 'test_user'@'%'; Query OK, 0 rows affected (0.00 sec)
3. 删除权限
删除权限主要通过与GRANT相对的REVOKE来实现,即解除指定的权限,使用方法一般是将以上GRANT替换为REVOKE,将TO替换为FROM,如下为解除test_user对eas_web数据库所有表的操作权限:
mysql> REVOKE ALL ON easy_web.* FROM 'test_user'@'%';
Query OK, 0 rows affected (0.00 sec)
4. 刷新权限
使权限在线生效:由于MySQL服务器会将权限相关的数据加载到内存中,通常通过以上操作进行权限控制时是写到权限控制的数据库表对应的磁盘文件中,所以需要通过FLUSH PRIVILEGES命令来重新从磁盘读取一次数据到内存中来使权限生效。
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
5. 删除用户
删除用户是通过DROP USER命令来实现,如下:
mysql> DROP USER 'test_user'@'%';
Query OK, 0 rows affected (0.01 sec)