28.1 访问控制
MySQL服务器的安全基础是: 用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。换句话说,用户不能对过多的数据具有过多的访问权。
28.2 管理用户
需要获得所有用户账号列表时。为此,可使用以下代码:
mysql> USE mysql;
Database changed
mysql> SELECT user FROM user;
+------------------+
| user |
+------------------+
| mysql.infoschema |
| mysql.session |
| mysql.sys |
| root |
+------------------+
- 分析:mysql数据库有一个名为user的表, 它包含所有用户账号。 user表有一个名为user的列,它存储用户登录名。新安装的服务器可能只有一个用户(如这里所示), 过去建立的服务器可能具有很多用户。
28.2.1 创建用户账号
为了创建一个新用户账号,使用CREATE USER语句,如下所示:
CREATE user ben IDENTIFIED BY 'p@$$wOrd';
- 分析:CREATE USER创建一个新用户账号。在创建用户账号时不一定需要口令,不过这个例子用IDENTIFIED BY 'p@$$wOrd’给出了一个口令。
为重新命名一个用户账号,使用RENAME USER语句,如下所示:
RENAME USER ben TO bforta;
28.2.2 删除用户账号
为了删除一个用户账号(以及相关的权限),使用DROP USER语句,如下所示:
DROP USER bforta;
28.2.3 设置访问权限
在创建用户账号后,必须接着分配访问权限。新创建的用户账号没有访问权限。它们能登录MySQL,但不能看到数据,不能执行任何数据库操作。为看到赋予用户账号的权限,使用SHOW GRANTS FOR,如下所示:
- 分析:输出结果显示用户bforta有一个权限USAGE ON .。 USAGE表示根本没有权限(我知道,这不很直观),所以,此结果表示在任意数据库和任意表上对任何东西没有权限。
为设置权限,使用GRANT语句。 GRANT要求你至少给出以下信息:
- 要授予的权限;
- 被授予访问权限的数据库或表;
- 用户名。
以下例子给出GRANT的用法:
GRANT SELECT ON crashcourse.* TO bforta;
- 分析:此GRANT允许用户在crashcourse.*( crashcourse数据库的所有表)上使用SELECT。 通过只授予SELECT访问权限,用户bforta对crashcourse数据库中的所有数据具有只读访问权限。
SHOW GRANTS反映这个更改:
- 分析:每个GRANT添加(或更新)用户的一个权限。 MySQL读取所有
授权,并根据它们确定权限。
GRANT的反操作为REVOKE,用它来撤销特定的权限。下面举一个例子:
REVOKE SELECT ON crashcourse.* FROM bforta;
- 分析:这条REVOKE语句取消刚赋予用户bforta的SELECT访问权限。 被撤销的访问权限必须存在,否则会出错。
GRANT和REVOKE可在几个层次上控制访问权限:
- 整个服务器,使用GRANT ALL和REVOKE ALL;
- 整个数据库,使用ON database.*;
- 特定的表,使用ON database.table;
- 特定的列;
- 特定的存储过程。
表28-1列出可以授予或撤销的每个权限。
权 限 | 说 明 |
---|---|
ALL | 除GRANT OPTION外的所有权限 |
ALTER | 使用ALTER TABLE |
ALTER ROUTINE | 使用ALTER PROCEDURE和DROP PROCEDURE |
CREATE | 使用CREATE TABLE |
CREATE ROUTINE | 使用CREATE PROCEDURE |
CREATE TEMPORARY TABLES | 使用CREATE TEMPORARY TABLE |
CREATE USER | 使用CREATE USER、 DROP USER、 RENAME USER和REVOKE ALL PRIVILEGES |
CREATE VIEW | 使用CREATE VIEW |
DELETE | 使用DELETE |
DROP | 使用DROP TABLE |
EXECUTE | 使用CALL和存储过程 |
FILE | 使用SELECT INTO OUTFILE和LOAD DATA INFILE |
GRANT OPTION | 使用GRANT和REVOKE |
INDEX | 使用CREATE INDEX和DROP INDEX |
INSERT | 使用INSERT |
LOCK TABLES | 使用LOCK TABLES |
PROCESS | 使用SHOW FULL PROCESSLIST |
RELOAD | 使用FLUSH |
REPLICATION CLIENT | 服务器位置的访问 |
REPLICATION SLAVE | 由复制从属使用 |
SELECT | 使用SELECT |
SHOW DATABASES | 使用SHOW DATABASES |
SHOW VIEW | 使用SHOW CREATE VIEW |
SHUTDOWN | 使用mysqladmin shutdown(用来关闭MySQL) |
SUPER | 使用CHANGE MASTER、 KILL、 LOGS、 PURGE、 MASTER 和SET GLOBAL。还允许mysqladmin调试登录 |
UPDATE | 使用UPDATE |
USAGE | 无访问权限 |
28.2.4 更改口令
为了更改用户口令,可使用SET PASSWORD语句。新口令必须如下加密: