权限系统工作原理:
MySQL权限系统通过下面两个阶段进行认证: (1)对连接的用户进行身份认证,合法的用户通过认证、不合法的用户拒绝连接。 (2)对通过认证的合法用户赋予相应的权限,用户可以在这些权限范围内对数据库做相应的操作。 对于身份,MySQL是通过IP地址和用户名联合进行确认的,例如MySQL安装默认创建的用户root@localhost 表示用户root只能从本地(localhost)进行连接才可以通过认证,此用户从其他任何主机对数据库进行的连接都将被拒绝。 也就是说,同样的一个用户名,如果来自不同的IP地址,则MySQL将其视为不同的用户。MySQL的权限表在数据库启动地时候 就载入内存,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限范围内的各 种操作了。
权限表
在权限存取的两个过程中,系统会用到“mysql”数据库(安装MySQL时被创建,数据库名字叫“mysql”)中user、host和db这3个最重要的权限表
表名 |
user |
db |
host |
用户列 |
User |
Host |
Host |
|
Password |
Db |
Db |
权限列 |
Select_priv |
User |
Select_priv |
|
Insert_priv |
Select_priv |
Insert_priv |
|
Update_priv |
Insert_priv |
Update_priv |
|
Delete_priv |
Update_priv |
Delete_priv |
|
Create_priv |
Delete_priv |
Create_priv |
|
Drop_priv |
Create_priv |
Drop_priv |
|
Reload_priv |
Drop_priv |
Grant_priv |
|
Shutdown_priv |
Grant_priv |
References_priv |
|
Process_priv |
References_priv |
Index_priv |
|
File_priv |
Index_priv |
Alter_priv |
|
Grant_priv |
Alter_priv |
Create_tmp_table_priv |
|
References_priv |
Create_tmp_table_priv |
Lock_tables_priv |
|
Index_priv |
Lock_tables_priv |
Create_view_priv |
|
Alter_priv |
Create_view_priv |
Show_view_priv |
|
Show_db_priv |
Show_view_priv |
Create_routine_priv |
|
Super_priv |
Create_routine_priv |
Alter_routine_priv |
|
Create_tmp_table_priv |
Alter_routine_priv |
Execute_priv |
|
Lock_tables_priv |
Execute_priv |
Trigger_priv |
|
Execute_priv |
Event_priv |
|
|
Repl_slave_priv |
Trigger_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 |
|
|
当用户进行连接的时候,权限表的存取过程有以下现个阶段。 • 先从user表中的host、user和passwd这3个字段中判断连接的IP、用户名和密码是否存在于表中,如果存在,则通过身份验证,否则拒绝连接。 • 如果通过身份验证,则按照以下权限表的顺序得到数据库权限:user->db->tables_priv->coloumns_priv。 • 在这几个权限表中,权限范围依次递减,全局权限覆盖局部权限。
权限说明
创建用户a3 并授权数据库和操作权限
a.使用create方法创建用户然后单独授权权限
create user 'a3'@'%' identified by '123456'; grant all on enterprise.* to a3; grant all on enterpriseuser.* to a3;
b.使用 GRANT方式创建
grant all privileges on *.* to a3@172.29.4.10;
授予权限:
(%代表所有其他远程机器都可登陆,localhost代表仅本台机器可以登陆,具体ip地址则代表具体哪台机器可登录)
授予单个权限(select权限)
#不包括 grant option权限 grant select on *.* to a3@'%'; #包括 grant option权限,这样被授权的用户可以吧这些权限再 grant select on *.* to a3@'%' with grant option;
授权给其他用户
授予所有权限:
#不包括 grant option权限 grant all on *.* to a3@'%'; #包括 grant option权限,这样被授权的用户可以吧这些权限再授权给其他用户 grant all on *.* to a3@'%' with grant option;
撤销权限:
撤销所有权限
#不包括 grant option权限 revoke all on *.*from a3@'%' ; #包括 grant option权限 revoke all,grant option from a3@'%';
撤销单个权限
#包括 grant option权限 revoke select on *.* from a3@'%';
授权某个库下所有表的所有权限a3 用户
grant all on enterprise.* to a3@'%';
修改后刷新权限
flush privileges;
注意,授权后必须FLUSH PRIVILEGES;否则无法立即生效