MySQL访问控制和用户管理

访问控制

  你须要给用户提供他们所需的访问权,且仅提供他们所需的访问权。这就是所谓的访问控制,管理访问控制须要建立和管理用户帐号。mysql

  • 多数用户只须要对表进行读和写,但少数用户甚至须要能建立和删除表;
  • 某些用户须要读表,但可能不须要更新表;
  • 你可能想容许用户添加数据,但不容许他们删除数据;
  • 某些用户(管理员)可能须要处理用户帐号的权限,但多数用户不须要;
  • 你可能想让用户经过存储过程访问数据,但不容许他们直接访问数据;
  • 你可能想根据用户登陆的地点限制对某些功能的访问。

  不要使用root 应该严肃对待root登陆的使用。仅在绝对须要时使用它(或许在你不能登陆其余管理帐号时使用)。不该该在平常的MySQL操做中使用root。sql

管理用户

mysql> USE mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SELECT user FROM user;
+------------------+
| user             |
+------------------+
| debian-sys-maint |
| mysql.infoschema |
| mysql.session    |
| mysql.sys        |
| root             |
+------------------+
5 rows in set (0.00 sec)
  • mysql数据库有一个名为user的表,它包含全部用户帐号。user表有一个名为user的列,它存储用户登陆名。

建立用户帐号

mysql> CREATE USER ben IDENTIFIED BY 'p@$$w0rd';
Query OK, 0 rows affected (0.06 sec)
  • CREATE USER建立一个新用户帐号。在建立用户帐号时不必定须要口令。数据库

  • 指定散列口令 IDENTIFIED BY指定的口令为纯文本,MySQL将在保存到user表以前对其进行加密。为了做为散列值指定口令,使用IDENTIFIED BY PASSWORD。安全

  • 使用GRANT或INSERT GRANT语句(稍后介绍)也能够建立用户帐号,但通常来讲CREATE USER是最清楚和最简单的句子。此外,也能够经过直接插入行到user表来增长用户,不过为安全起见,通常不建议这样作。MySQL用来存储用户帐号信息的表(以及表模式等)极为重要,对它们的任何毁坏均可能严重地伤害到MySQL服务器。所以,相对于直接处理来讲,最好是用标记和函数来处理这些表。服务器

重命名帐户

mysql> RENAME USER ben TO bforta;
Query OK, 0 rows affected (0.01 sec)
  • MySQL 5以前 仅MySQL 5或以后的版本支持RENAME USER。为了在之前的MySQL中重命名一个用户,可以使用UPDATE直接更新user表。

删除用户帐号

mysql> DROP USER bforta;
Query OK, 0 rows affected (0.00 sec)
  • 在MySQL 5之前,DROP USER只能用来删除用户帐号,不能删除相关的权限。所以,若是使用旧版本的MySQL,须要先用REVOKE删除与帐号相关的权限,而后再用DROP USER删除帐号。

设置访问权限

SHOW GRANTS FOR username@localhost;
  • 为看到赋予用户帐号的权限,使用SHOW GRANTS FOR。
  • 用户定义为user@host MySQL的权限用用户名和主机名结合定义。若是不指定主机名,则使用默认的主机名%(授予用户访问权限而无论主机名)。

为设置权限,使用GRANT语句。GRANT要求你至少给出如下信息:session

  • 要授予的权限;
  • 被授予访问权限的数据库或表;
  • 用户名。
GRANT SELECT ON crashcourse.* TO bforta;
  • 此GRANT容许用户在crashcourse.*(crashcourse数据库的全部表)上使用SELECT。经过只授予SELECT访问权限,用户bforta对crashcourse数据库中的全部数据具备只读访问权限。

GRANT的反操做为REVOKE,用它来撤销特定的权限。函数

REVOKE SELECT ON crashcourse.* FROM bforta;
  • 这条REVOKE语句取消刚赋予用户bforta的SELECT访问权限。被撤销的访问权限必须存在,不然会出错。

GRANT和REVOKE可在几个层次上控制访问权限:ui

  • 整个服务器,使用GRANT ALL和REVOKE ALL;
  • 整个数据库,使用ON database.*;
  • 特定的表,使用ON database.table;
  • 特定的列;
  • 特定的存储过程。

列出能够授予或撤销的每一个权限。this

权 限 说 明
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 无访问权限
  • 将来的受权 在使用GRANT和REVOKE时,用户帐号必须存在,但对所涉及的对象没有这个要求。这容许管理员在建立数据库和表以前设计和实现安全措施。这样作的反作用是,当某个数据库或表被删除时(用DROP语句),相关的访问权限仍然存在。并且,若是未来从新建立该数据库或表,这些权限仍然起做用。
  • 简化屡次受权 可经过列出各权限并用逗号分隔,将多条GRANT语句串在一块儿

更改口令

mysql> SET PASSWORD FOR bforta=PASSWORD ('P@ssW0rd');
Query OK, 0 rows affected (0.01 sec)
  • SET PASSWORD更新用户口令。新口令必须传递到Password()函数进行加密。加密

  • SET PASSWORD还能够用来设置你本身的口令

mysql> SET PASSWORD =PASSWORD ('P@ssW0rd');
Query OK, 0 rows affected (0.01 sec)
  • 在不指定用户名时,SET PASSWORD更新当前登陆用户的口令。
相关文章
相关标签/搜索