安装Mysql时会自动安装一个名为mysql的数据库。这个数据库下面存储的是权限表。
Mysql会根据这些权限表的内容为每个用户赋予相应的权限
所以我们也是通过这些表来实现管理用户和权限的
use mysql; show tables; +---------------------------+ | Tables_in_mysql | +---------------------------+ | columns_priv | | db | | event | | func | | general_log | | help_category | | help_keyword | | help_relation | | help_topic | | innodb_index_stats | | innodb_table_stats | | ndb_binlog_index | | plugin | | proc | | procs_priv | | proxies_priv | | servers | | slave_master_info | | slave_relay_log_info | | slave_worker_info | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+
user表
1. user表的作用相当与mysql工作流程中的"用户管理模块",它决定着我们对一个连接允许或拒绝
2. user表用于记录允许连接到服务器的用户帐号信息,里面的权限是全局级的
3. 根据user表结构,表的字段可以分为4类
(1) 用户列
Host主机名、User用户名、Password密码
(2) 权限列(以priv结尾的)
包含普通权限:查询权限、修改权限等
和高级管理权限:关闭服务权限、超级权限、加载用户
这些字段只有N和Y两个选项,为安全期间默认值都设为N
Grant_priv是否有Grant权限、Shutdown_priv是否有停止mysql服务的权限
Super_priv是否有超级权限、Execute_priv是否有执行存储过程和函数的权限
(3) 安全列
(4) 资源控制列
这些字段默认值为0,表示没有限制
max_questions 每小时允许执行多少次查询
max_updates 每小时允许执行多少次更新
max_connections 每小时允许建立多少连接
max_user_connections 单个用户可以同时具有的连接数
desc user; +------------------------+-----------------------------------+------+-----+---- | Field | Type | Null | Key | Default | Extra | +------------------------+-----------------------------------+------+-----+--- | Host | char(60) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Password | char(41) | NO | | | | | Select_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Insert_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Update_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Delete_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Create_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Drop_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Reload_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Shutdown_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Process_priv | enum(‘N‘,‘Y‘) | NO | | N | | | File_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Grant_priv | enum(‘N‘,‘Y‘) | NO | | N | | | References_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Index_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Alter_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Show_db_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Super_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Create_tmp_table_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Lock_tables_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Execute_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Repl_slave_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Repl_client_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Create_view_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Show_view_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Create_routine_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Alter_routine_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Create_user_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Event_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Trigger_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Create_tablespace_priv | enum(‘N‘,‘Y‘) | NO | | N | | | ssl_type | enum(‘‘,‘ANY‘,‘X509‘,‘SPECIFIED‘) | NO | | | ssl_cipher | blob | NO | | NULL | | | x509_issuer | blob | NO | | NULL | | | x509_subject | blob | NO | | NULL | | | max_questions | int(11) unsigned | NO | | 0 | | | max_updates | int(11) unsigned | NO | | 0 | | | max_connections | int(11) unsigned | NO | | 0 | | | max_user_connections | int(11) unsigned | NO | | 0 | | | plugin | char(64) | YES | | mysql_native_password | | | authentication_string | text | YES | | NULL | | | password_expired | enum(‘N‘,‘Y‘) | NO | | N | | +------------------------+-----------------------------------+------+-----+----------------
db表
1. 用户被允许连接了,但是是不是可以就能操作所有数据库了呢?
2. 所以我们需要db表/host表,用来规定某一个用户对一个数据库的权限
3. db表的字段分为两类:
(1)用户列
Host主机名、Db数据库名、User用户名
(2)权限列
用户是先根据user表的内容获得权限,再根据db表的内容获取权限
例如,user表中某用户的Select_priv字段为‘N’,表示所有数据库中的表它都无权查询
但db表中这一用户对student表的Select_priv字段设为了‘Y’,表示它只有查询student表的权限
desc db; +-----------------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+---------------+------+-----+---------+-------+ | Host | char(60) | NO | PRI | | | | Db | char(64) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Select_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Insert_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Update_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Delete_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Create_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Drop_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Grant_priv | enum(‘N‘,‘Y‘) | NO | | N | | | References_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Index_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Alter_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Create_tmp_table_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Lock_tables_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Create_view_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Show_view_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Create_routine_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Alter_routine_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Execute_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Event_priv | enum(‘N‘,‘Y‘) | NO | | N | | | Trigger_priv | enum(‘N‘,‘Y‘) | NO | | N | | +-----------------------+---------------+------+-----+---------+-------+
tables_priv表和columns_priv表
1. 同理,即便用户有权对某一数据库操作,那么是不是对所有表都可以操作?对表中的所有记录都可以操作?
2. tables_priv表用来对单个表进行权限设置
3. columns_priv表用来对单条记录(列)进行权限设置
4. 其包含的字段主要有:
Host 主机名
Db 数据库名
User 用户名
Table_name表名
Table_priv对表进行操作的权限(select,insert,update,delete,create,drop,grant,references,index,alter)
Column_priv对记录进行操作的权限(select,insert,update,references)
Timestamp修改权限的时间
Grantor 权限的设置者
用户的权限分配规则
(1)Mysql的权限分配是按照user表--->db表--->tables_priv表--->columns_priv表的顺序进行分配的
(2)如果user表中某一权限的值为Y,就不许要检查往后的表了
(3)如果user表中某一权限的值为N,则一次往后检查每一张表
时间: 2024-10-10 08:01:10