一、权限系统作用
MySQL 权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的 SELECT、INSERT、UPDATE和DELETE 权限。
二、工作原理
MySQL 权限系统保证所有的用户只执行允许做的事情。当你连接MySQL服务器时,你的身份由你从那儿连接的主机和你指定的用户名来决定。连接后发出请求后,系统根据你的身份和你想做什么来授予权限。
MySQL 在认定身份中考虑你的主机名和用户名字,是因为几乎没有原因假定一个给定的用户在因特网上属于同一个人。例如,从 office.com连接的用户 joe 不一定和从 elsewhere.com 连接的 joe 是同一个人。MySQL 通过允许你区分在不同的主机上碰巧有同样名字的用户来处理它:你可以对 joe 从 office.com 进行的连接授与一个权限集,而为 joe 从 elsewhere.com 的连接授予一个不同的权限集。
就类似于,有的公司,你可以在公司上网使用的权限和在家中上网使用的权限是不一样的。尽管你使用的同一个账号。
MySQL存取控制包含2个阶段:
- 阶段1:服务器检查是否允许你连接。
- 阶段2:假定你能连接,服务器检查你发出的每个请求。看你是否有足够的权限实施它。例如,如果你从数据库表中选择(select)行或从数据库删除表,服务器确定你对表有SELECT权限或对数据库有DROP权限。
注意:如果连接时你的权限被更改了(通过你和其它人),这些更改不一定立即对你发出的下一个语句生效。
一般情况,你通过GRANT和REVOKE语句间接来操作 授权表的内容,设置账户并控制个人的权限。
grant:授予
revoke:撤销
授权表
服务器在存取控制的两个阶段使用 mysql 数据库中的 user、db 和 host 表,这些授权表中的列如下:
user 表:
db 表:
除了user、db和host授权表,如果请求涉及表,服务器可以另外参考tables_priv和columns_priv表。tables_priv和columns_priv表可以对表和列提供更精确的权限控制。这些表的列如下:
为了对涉及保存程序的请求进行验证,服务器将查阅procs_priv表
每个授权表包含范围列和权限列:
- 范围列:范围列就是上面标示出主键的列。例如, 一个user表行的Host和User值为’thomas.loc.gov’和’bob’,将被用于证实来自主机thomas.loc.gov的bob对服务器的连接。
- 权限列: 权限列指出由一个表行授予的权限,即,可实施什么操作。
在user、db和host表中,所有权限列于单独的列内,被声明为ENUM(‘N’,‘Y’) DEFAULT ‘N’。换句话说,每一个权限都可以被禁用和启用,并且 默认是禁用。
在tables_priv、columns_priv和procs_priv表中,权限列被声明为SET列。这些列的值可以包含该表控制的权限的组合:
简单地说,服务器使用这样的授权表:
- user 表范围列决定是否允许或拒绝到来的连接。对于允许的连接,user 表授予的权限指出用户的全局(超级用户)权限。这些权限适用于服务器上的所有(all)数据库。
- db 表范围列决定用户能从哪个主机存取哪个数据库。权限列决定允许哪个操作。授予的数据库级别的权限适用于数据库和它的表。
- 当你想要一个给定的 db 表行应用于若干主机时,db 和 host 表一起使用。
- tables_priv和columns_priv表类似于db表,但是更精致:它们在表和列级应用而非在数据库级。授予表级别的权限适用于表和所有它的列。授予列级别的权限只适用于专用列。
- procs_priv表适用于保存的程序。授予程序级别的权限只适用于单个程序。
注释:host表不受GRANT和REVOKE语句的影响。大多数MySQL安装根本不需要使用该表。
管理权限(例如RELOAD或SHUTDOWN等等)仅在user表中被指定。这是因为管理性操作是服务器本身的操作并且不是特定数据库,因此没有理由在其他授权表中列出这样的权限。事实上,只需要查询user表来决定你是否执行一个管理操作。
FILE权限也仅在user表中指定。它不是管理性权限,但你在服务器主机上读或写文件的能力与你正在存取的数据库无关。
刷新和查看权限表
当mysqld服务器启动时,将授权表的内容读入到内存中。你可以通过FLUSH PRIVILEGES 语句或执行 mysqladmin flush-privileges 或mysqladmin reload 命令让它重新读取表。
当你修改授权表的内容时,确保你按你想要的方式更改权限设置是一个好主意。要检查给定账户的权限,使用SHOW GRANTS语句。例如,要检查Host和User值分别为pc84.example.com和bob的账户所授予的权限,应通过语句:
mysql> SHOW GRANTS FOR 'bob'@'pc84.example.com';
mysql> show grants for 'root'@'localhost';
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `root`@`localhost` WITH GRANT OPTION |
| GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `root`@`localhost` WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
一个有用的诊断工具是mysqlaccess脚本,由 Carlier Yves 提供给MySQL分发。使用 --help 选项调用mysqlaccess查明它怎样工作。注意:mysqlaccess仅用user、db和host表检查存取。它不检查tables_priv、columns_priv或procs_priv表中指定的表、列和程序级权限。