在 mysql 的语句处理流程 中,有两处进行了权限的管理:分别为 authentication 和 access control。
1. authentication是使用user(用户名)和host(客户端主机)以及password对客户端的身份进行验证,具体如下:
a) 首先调用sql/sql_acl.cc中的acl_check_host()判断在匹配到的客户端主机名或ip中是否对应该客户端提供的用户名;
b) 然后进行密码验证:
i) server端发送一段随机字符串 str1;
ii) client端将密码进行两次hash,并使用接受到的str1一起生成 str2 发送到server端;
iii) server端进行验证;
c) 调用sql/sql_parse.cc中的check_user()核实该用户是否存在以及密码是否正确;
d) 最后调用sql/sql_acl.cc中acl_getroot(),用来核实mqh,如果满足要求,则调用acl_update_user()将THD类中的用户数据和资源结构进行更新;
2. access control是通过系统权限表来判断用户是否有对某个数据库对象进行操作的权限;
这里主要参照的是mysql库中的user/db/host/tables_priv/columns_priv/procs_priv六个表;
mysql给用户的权限按从大到小:user -> db(host) -> tables_priv -> columns_priv -> procs_priv
参考: 《mysql核心内幕》