-
Notifications
You must be signed in to change notification settings - Fork 111
MySQL 访问权限系统
xiaoboluo768 edited this page Jun 7, 2020
·
2 revisions
- MySQL的mysql 系统库提供了user、db、tables_priv、columns_priv、procs_priv、proxies_priv几张表用于存放不同权限范围的用户帐号相关的数据,这些表共同组成了MySQL 的访问权限系统
- MySQL权限系统的主要功能是对从给定主机连接到MySQL Server的用户进行身份验证,并校验该用户在该Server中的数据库对象访问的权限(如SELECT,INSERT,UPDATE和DELETE),另外,还包括管理匿名用户访问和授予特定的MySQL权限的功能(如执行 LOAD DATA INFILE 语句和管理操作权限等)
- MySQL 访问权限系统有如下限制:
- 不能明确拒绝给定用户访问,只能明确地允许给定用户的访问,例如:使用了正确的帐号和密码,且从被授予访问的主机上访问数据库
- 不能单独授予用户只能创建或删除数据库中的表,而不能创建或删除数据库本身(指定了某用户对某表的 create和drop权限之后,用户就能够创建和删除该表所在的库)
- 帐号的密码在Server中的作用域是全局的。不能使用密码来与特定对象的访问权限挂钩(如数据库、表或存储过程与函数等)
- MySQL访问权限系统的用户界面由几个SQL语句组成:如CREATE USER、GRANT和REVOKE
- 在Server内部,MySQL 将权限信息存储在mysql数据库的权限表中(在名为mysql的数据库下的user、db、tables_priv、columns_priv、procs_priv、proxies_priv几张表中)。 MySQL Server在启动时将这些表的内容读入内存,后续针对用户的访问控制决策基于权限表的内存副本实现
- MySQL访问权限系统可以确保只有被允许的(与用户权限匹配的)操作才能够在Server中执行。当一个用户连接到MySQL Server时,用户的认证身份由"请求连接的主机名和用户名"确定,MySQL使用主机名+用户名的方式来识别和区分"相同主机不同用户"和"不同主机相同用户"发出的请求(例如:从office.example.com连接的用户joe和从home.example.com连接的用户joe在MySQL Server中实际上是被当作两个不同的连接者来处理的,所以可以设置不同的密码、不同的权限),例如:
root@localhost : mysql 01:03:04> show grants for test_a@'localhost';
+---------------------------------------------+
| Grants for test_a@localhost |
+---------------------------------------------+
| GRANT SELECT ON *.* TO 'test_a'@'localhost' |
+---------------------------------------------+
1 row in set (0.00 sec)
root@localhost : mysql 01:03:22> show grants for test_a@'%';
+---------------------------------------------+
| Grants for test_a@% |
+---------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO 'test_a'@'%' |
+---------------------------------------------+
1 row in set (0.00 sec)
- 当用户使用客户端程序连接到MySQL Server时,MySQL的访问控制分为如下两个阶段:
- 阶段1:Server根据身份标识(主机名+用户名组成的帐号名)在MySQL 的访问权限控制表中查询相关信息,以确定需要接受或拒绝该用户的连接(没有查询到就拒绝连接),如果查询到了用户记录,则校验用户提供的帐号密码是否正确,如果密码不正确则拒绝连接,这一阶段报错信息类似为:ERROR 1045 (28000): Access denied for user 'test_a'@'localhost' (using password: YES)
- 阶段2:用户连接成功之后,Server会检查用户访问请求中的每个声明来确定是否有足够的权限来执行。例如:如果尝试从数据库的表中查询数据行或从数据库中删除表,Server将验证该用户否具有该表的SELECT权限或数据库的DROP权限,如果无对应权限,则这一阶段的报错信息类似为:ERROR 1142 (42000) at line 1: UPDATE command denied to user 'test_a'@'localhost' for table 'sbtest1'
- PS:关于这两阶段的详细信息,详见1.1.3.1.和1.1.3.2. 节
- 如果某用户在已经建立连接期间,权限发生了变更(自身修改或者其他用户修改),那么对于该用户执行下一条语句时,这些权限变更不一定会立即生效。如果未生效需要执行flush privileges;,有关Server重新加载授权表的详细信息,详见1.1.4.节
- 有关诊断权限导致的连接问题,详见1.1.5. 节
- 参考资料:
上一篇:mysql schema详解 |下一篇:MySQL 提供了哪些权限
- 验证、测试、整理:罗小波
- QQ:309969177
- 提示:本系列文章的主体结构遵循Oracle MySQL 官方 5.7 手册中,关于information_schema、mysql schema、performance_schema、sys schema的章节结构体系,并额外添加了一些验证、测试数据。鉴于本人精力和能力有限,难免出现一些纰漏,欢迎大家踊跃指正!