MySQL(管理)01 -- 用户User和权限Privileges<A.权限验证>

MySQL中的user由用户名和主机名构成,如"root@localhost",同用户名但不同主机名对MySQL来讲是不同的,也就是说"root@localhost"和"root@127.0.0.1"是不同的,尽管它们都是root用户。

1.权限验证

在MySQL服务器启动后会载入权限表到内存中,当用户要连接服务器,会读取权限表来验证和分配权限,即在内存中进行权限的读取和写入。

MySQL中的权限系统经过两步验证:

1.合法性验证:验证user是否合法,合法者允许连接服务器,否则拒绝连接。

2.权限验证和分配:对通过合法性验证的用户分配对数据库中各对象的操作权限。

1.1 权限表

MySQL中的权限表都存放在mysql数据库(schema)中。权限相关的表有user表、db表、tables_priv表、columns_priv表、procs_priv表(存储过程和函数相关的权限)。 下表来自于MySQL8 的官方文档。

表名userdbtables_privcolumns_privprocs_priv
用户和名词HostHostHostHostHost
UserDbDbDbDb
 UserUserUserUser
  Table_nameTable_nameRoutine_name
   Column_nameRoutine_type
权限列Select_privSelect_privTable_privColumn_privProc_priv
Insert_privInsert_privColumn_priv  
Update_privUpdate_priv   
Delete_privDelete_priv   
Index_privIndex_priv   
Alter_privAlter_priv   
Create_privCreate_priv   
Drop_privDrop_priv   
Grant_privGrant_priv   
Create_view_privCreate_view_priv   
Show_view_privShow_view_priv   
Create_routine_privCreate_routine_priv   
Alter_routine_privAlter_routine_priv   
Execute_privExecute_priv   
Trigger_privTrigger_priv   
Event_privEvent_priv   
Create_tmp_table_privCreate_tmp_table_priv   
Lock_tables_privLock_tables_priv   
References_privReferences_priv   
Reload_priv    
Shutdown_priv    
Process_priv    
File_priv    
Show_db_priv    
Super_priv    
Repl_slave_priv    
Repl_client_priv    
Create_user_priv    
Create_tablespace_priv    
Create_role_priv    
Drop_role_priv    
安全字段ssl_type    
ssl_cipher    
x509_issuer    
x509_subject    
plugin    
authentication_string(这是存放用户密码)    
password_expired    
password_last_changed    
password_lifetime    
account_locked    
Password_reuse_history    
Password_reuse_time    
Password_require_current    
User_attributes    
资源控制列max_questions    
max_updates    
max_connections    
max_user_connections    
其他字段  TimestampTimestampTimestamp
  Grantor Grantor

   注:对database和Table,MySQL设计有专门drop权限的,则需要拥有drop权限的用户才能drop删除对象。而对于routine,因为MySQL没有设计专门的drop权限,则拥有create routine权限即自动同时拥有drop routine权限。

   这几个表用的最多的是user表。user表主要分为几个部分:用户列、权限列、安全列、资源控制列以及杂项列,最需要关注的是用户列和权限列。其中权限列又分为普通权限(上表中红色字体)和管理权限列,如select类的为普通权限,super权限为管理权限。且可以看到,db表中的权限全都是普通权限,user表中除了db表中具有的普通权限还有show_db_pirv和create_tablespace_priv,除此之外还有几个管理员权限。也就是说,db中没有的权限是无法授予到指定数据库的。例如不能授予super权限给test数据库。

另外,usage权限在上表中没有列出,因为该权限是所有用户都有的权限,它只用来表示能否登录数据库,它的一个特殊功能是grant仅指定该权限的时候不会影响现有权限,也就是说可以拿grant来修改密码而不影响现有权限。

需要说明的是,从user表到db表再到tables_priv表最后是columns_priv表,它们的权限是逐层细化的。user表中的普通权限是针对所有数据库的,例如在user表中的select_priv为Y,则对所有数据库都有select权限;db表是针对特定数据库中所有表的,如果只有test数据库中有select权限,那么db表中就有一条记录test数据库的select权限为Y,这样对test数据库中的所有表都有select权限,而此时user表中的select权限就为N(因为为Y的时候是所有数据库都有权限);同理tables_priv表也一样,是针对特定表中所有列的权限;columns_priv则是针对特定列的权限。

所以对于已经通过身份合法性验证的用户的权限读取和分配的机制如下:

  • 1.读取uesr表,看看user表是否有对应为Y的权限列,有则分配。
  • 2.读取db表,看看db表中是否有哪个数据库分配了对应的权限。
  • 3.读取tables_priv表,看看哪些表中有对应的权限。
  • 4.读取columns_priv表,看看对哪些具体的列有什么权限。

例如,为某一用户授予test数据库的select权限。可以看到user表中的select_priv为N,而db表中的select为Y。

 
  1. GRANT SELECT ON test.* TO 'long'@'192.168.100.1' IDENTIFIED BY '123456';

  2. SELECT host,user,select_priv FROM mysql.user;

  3. SELECT * FROM mysql.db;

 

1.2 图解认证和权限分配的两个阶段

 

 

1.3 权限生效时机

在服务器启动时读取权限表到内存中,从此时开始权限表生效。

之后使用grantrevokeset password 等命令也会隐含的刷新权限表到内存中

另外,使用显式的命令flush privileges或mysqladmin flush-privileges或mysqladmin reolad也会将上述几张权限表重新刷到内存中以供后续的身份验证和权限验证、分配。

 

转载链接:https://blog.csdn.net/zyplanke/article/details/103669732

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值