第一:用户管理模块
第二:用户访问动作控制模块,用户访问动作最常见就是DML,DDL
其中用户管理模块的作用,就是验证用户能否合法登录mysql数据库,而用户访问动作控制模块,则控制这合法用户能做动作。
其实这么说还是有些抽象,那来看看mysql数据库中关于权限访问控制的4张表。
mysql.user
mysql.db
mysql.tables_priv
mysql.columns_priv
用户管理模块由mysql.user控制,用户访问动作控制模块由mysql.db,mysql.tables_priv,mysql.columns_priv三张表一起控制。
其权限验证大概流程如下所示
举一个select语句的例子
select id,name
from test.t4
where status=‘delete‘
用户要执行这个select语句整个流程
第一步:应用首先需要连接mysql数据库,连接时验证host,user,password,如果不满足,则连接被拒绝,例如:用户名不正确,密码不正确,host主机被限制在特殊网段(192.168.2.%),或者限制本地登录(localhost)
第二步:验证global级别是否有select权限,即验证mysql.user表中的select权限,如果Select_priv为Y,则不做后续验证
mysql> select * from mysql.user where user=‘abc‘\G;
*************************** 1. row ***************************
Host: %
User: abc
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string: *0D3CED9BEC10A777AEC23CCC353A8C08A633045E
password_expired: N
password_last_changed: 2020-09-01 00:52:37
password_lifetime: NULL
account_locked: N
1 row in set (0.00 sec)
第三步:验证db级别select权限,如果有,则后续不验证
mysql> select * from mysql.db where user=‘abc‘\G;
*************************** 1. row ***************************
Host: %
Db: test
User: abc
Select_priv: Y
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Execute_priv: N
Event_priv: N
Trigger_priv: N
1 row in set (0.00 sec)
第四步:验证表级别权限,如果有,则后续不验证
mysql> select * from mysql.tables_priv where user=‘abc‘\G;
*************************** 1. row ***************************
Host: %
Db: test
User: abc
Table_name: t4
Grantor: root@localhost
Timestamp: 0000-00-00 00:00:00
Table_priv: Select
Column_priv:
1 row in set (0.00 sec)
第五步:验证列级别权限,如果有,则后续不验证
mysql> select * from columns_priv;
+------+------+------+------------+-------------+---------------------+-------------+
| Host | Db | User | Table_name | Column_name | Timestamp | Column_priv |
+------+------+------+------------+-------------+---------------------+-------------+
| % | test | abc | t4 | id | 0000-00-00 00:00:00 | Select |
| % | test | abc | t4 | name | 0000-00-00 00:00:00 | Select |
| % | test | abc | t4 | status | 0000-00-00 00:00:00 | Select |
+------+------+------+------------+-------------+---------------------+-------------+
3 rows in set (0.00 sec)
如果以上都验证都通过,则拒接执行select语句,上述详细流程图如下所示
这个mysql权限访问控制内幕,你get了吧。