MySQL权限系统保证所有的用户可以严格地做他们假定被允许做的事情。当你连接一个MySQL服务器时, 你的身份由你从那连接的主机和你指定的用户名来决定,系统根据你的身份和你想做什么来授予权限。
MySQL在认定身份中考虑你的主机名和用户名字,是因为有很小的原因假定一个给定的用户在因特网上属于同一个人。例如,用户从whitehouse.gov
连接的bill
不必和从mosoft.com
连接bill
是同一个人。 MySQL通过允许你区分在不同的主机上碰巧有同样名字用户来处理它:你可以对从whitehouse.gov
连接授与bill
一个权限集,而为从microsoft.com
的连接授予一个不同的权限集。
MySQL存取控制包含2个阶段:
- 阶段1:服务器检查你是否允许连接。
- 阶段2:假定你能连接,服务器检查你发出的每个请求。看你是否有足够的权限实施它。例如,如果你从数据库中一个表精选(select)行或从数据库抛弃一个表,服务器确定你对表有select权限或对数据库有drop权限。
服务器在存取控制的两个阶段使用在mysql
的数据库中的user
、db
和host
表,在这些授权表中字段如下:
表名称 | user |
db |
host |
范围字段 | Host |
Host |
Host |
User |
Db |
Db | |
Password |
User |
||
权限字段 | Select_priv |
Select_priv |
Select_priv |
Insert_priv |
Insert_priv |
Insert_priv | |
Update_priv |
Update_priv |
Update_priv | |
Delete_priv |
Delete_priv |
Delete_priv | |
Index_priv |
Index_priv |
Index_priv | |
Alter_priv |
Alter_priv |
Alter_priv | |
Create_priv |
Create_priv |
Create_priv | |
Drop_priv |
Drop_priv |
Drop_priv | |
Grant_priv |
Grant_priv |
Grant_priv | |
Reload_priv |
|||
Shutdown_priv |
|||
Process_priv |
|||
File_priv |
对存取控制的第二阶段(请求证实),如果请求涉及表,服务器可以另外参考tables_priv
和columns_priv
表。这些表的字段如下:
表名称 | tables_priv |
columns_priv |
范围字段 | Host |
Host |
Db |
Db | |
User |
User | |
Table_name |
Table_name | |
Column_name | ||
权限字段 | Table_priv |
Column_priv |
Column_priv |
||
其他字段 | Timestamp |
Timestamp |
Grantor |
每个授权表包含范围字段和权限字段。
范围字段决定表中每个条目的范围,即,条目适用的上下文。例如, 一个user
表条目的Host
和User
值为'thomas.loc.gov'
和'bob'
将被用于证实来自主机thomas.loc.gov
的bob
对服务器的连接。同样,一个db
表条目的Host
、User
和Db
字段的值是'thomas.loc.gov'
、'bob'
和'reports'
将用在bob
从主机联接thomas.loc.gov
存取reports
数据库的时候。 tables_priv
和columns_priv
表包含范围字段,指出每个条目适用的表或表/列的组合。
对于检查存取的用途,比较Host
值是忽略大小写的。User
、Passwor
d、Db
和Table_name
值是区分大小写的。Column_name
值在MySQL3.22.12或以后版本是忽略大小写的。
权限字段指出由一个表条目授予的权限,即,可实施什么操作。服务器组合各种的授权表的信息形成一个用户权限的完整描述。为此使用的规则在6.8 存取控制, 阶段2:请求证实描述。
范围字段是字符串,如下所述;每个字段的缺省值是空字符串:
字段名 | 类型 | |
Host |
CHAR(60) | |
User |
CHAR(16) | |
Password |
CHAR(16) | |
Db |
CHAR(64) |
(tables_priv 和columns_priv 表为CHAR(60) ) |
在user
、db
和host
表中,所有权限字段被声明为ENUM('N','Y')
--每一个都可有值'N'
或'Y'
,并且缺省值是'N'
.
在tables_priv
和columns_priv
表中,权限字段被声明为SET
字段:
表名 | 字段名 | 可能的集合成员 |
tables_priv |
Table_priv |
'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter' |
tables_priv |
Column_priv |
'Select', 'Insert', 'Update', 'References' |
columns_priv |
Column_priv |
'Select', 'Insert', 'Update', 'References' |
简单地说,服务器使用这样的授权表:
user
表范围字段决定是否允许或拒绝到来的连接。对于允许的连接,权限字段指出用户的全局(超级用户)权限。db
和host
表一起使用:db
表范围字段决定用户能从哪个主机存取哪个数据库。权限字段决定允许哪个操作。- 当你想要一个给定的
db
条目应用于若干主机时,host
表作为db
表的扩展被使用。例如,如果你想要一个用户能在你的网络从若干主机使用一个数据库,在用户的db
表的Host
条目设为空值,然后将那些主机的每一个移入host
表。这个机制详细描述在6.8 存取控制, 阶段2:请求证实。
tables_priv
和columns_priv
表类似于db
表,但是更精致:他们在表和列级应用而非在数据库级。
注意管理权限(reload, shutdown, 等等)仅在user
表中被指定。这是因为管理性操作是服务器本身的操作并且不是特定数据库,因此没有理由在其他授权表中列出这样的权限。事实上,只需要请教user
表来决定你是否执行一个管理操作。
file权限也仅在user
表中指定。它不是管理性权限,但你读或谢在服务器主机上的文件的的能力独立于你正在存取的数据库。
当mysqld
服务器启动时,读取一次授权表内容。对授权表的更改生效在6.9 权限更改何时生效描述。
当你修改授权表的内容时,确保你按你想要的方式更改权限设置是一个好主意。为帮助诊断问题,见6.13 “存取拒绝引起”
错误的原因。对于安全问题上的忠告,见6.14 怎么对使MySQL安全对抗解密高手。
一个有用的诊断工具是mysqlaccess
脚本,由Carlier Yves 提供给MySQL分发。使用--help
选项调用mysqlaccess
查明它怎样工作。注意:mysqlaccess
仅用user
、db
和host
表仅检查存取。它不检查表或列级权限。