用户和权限管理

MySQL 用户可以分为 普通用户 和 ROOT 用户, ROOT 用户具有所有权限包括创建用户、删除用户和修改用户的密码等管理权限,普通用户只能被授予各种权限。

登录

启动 MySQL 服务之后,可以通过 MySQL 命令来登录 MySQL 服务器命令格式如下:

mysql -h hostname|hostIP -P port -u username -p databases -e "SQL 语句"
  1. -h 主机名或主机 IP

  2. -P 端口

  3. -u 用户名

  4. -p 密码

  5. databases: 指明需要登录哪一个数据库

  6. -e 后面可以带 SQL 当 MySQL 服务器执行完后将会指定登出 MySQL 服务器

用户管理

创建用户

在 MySQL 数据库中,可以使用 CREATE USER 语句创建新的用户。

语句格式

CREATE USER 用户名 [IDENTIFIED BY '密码'][,IDENTIFIED BY '密码']
  1. 用户名参数表示新建用户的用户名,由 用户 (USER)主机名 (HOST) 构成

  2. CREATE USER 可以一次创建多个用户

实践

  1. 不填主机名

CREATE USER xiaou IDENTIFIED BY '123'
select user, host from user;

+---------------+-----------+

| user          | host      |

+---------------+-----------+

| xiaou         | %         |

| mysql.session | localhost |

| mysql.sys     | localhost |

| root          | localhost |

+---------------+-----------+

从结果中可以看出默认 host%

  1. 不设置密码

CREATE USER xiaou2

需要使用 mysql -u xiaou2 登录不能带 -p 否则会报错

  1. 完整创建用户

create user 'xiaou3@localhost' IDENTIFIED by '123'
select user, host from user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| xiaou         | %         |
| xiaou2        | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
| xiaou3        | localhost |
+---------------+-----------+

修改用户

语句格式

UPDATE mysql.user set 修改项 where user = '用户名';

实践

UPDATE mysql.user set host='localhost' where user = 'xiaou2';
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| xiaou         | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
| xiaou2        | localhost |
| xiaou3        | localhost |
+---------------+-----------+

删除用户

语句格式

DROP USER 用户名[,用户名]

实践

删除 xiaou3

DROP USER xiaou3;

会出现错误 ERROR 1396 (HY000): Operation DROP USER failed for 'xiaou3'@'%' 因为默认是 % 需要指定 host。

DROP USER xiaou3@'localhost';
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| xiaou         | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
| xiaou2        | localhost |
+---------------+-----------+

密码修改

  1. 使用 SET 语句来修改当前密码

SET PASSWORD='new_password';
SET PASSWORD='xiau123';
  1. 修改其他用户密码

 SET PASSWORD FOR 'xiaou2'@'localhost'='xiaou123';

权限管理

查看所有权限

show privileges;

权限分布

| 权限分布 | 可能的设置权限 |

| -------- | ------------------------------------------------------------ |

| 表权限 | select/insert/upadte/delete/create/drop/grant/references/index/alter |

| 列权限 | select/insert/update/references |

| 过程权限 | execute/alter routine/grant |

权限授予原则

  1. 只授予满足需要最小权限,防止出现问题

  2. 创建用户的时候如果可以限制用户登录的主机那么一定要限制,一般指定IP或者内网。

  3. 定期清理不使用的用户,回收权限或删除用户

  4. 为每个用户都要设置较为复杂的密码

授予权限

GRANT 权限[,权限] ON 数据库名称.表名称 TO 用户名 [IDENTIFIED BY '密码'];
  • 如果在授予权限的时候没有发现用户,则会直接创建一个用户

  • ALL PRIVILEGES 是表示所有权限,你也可以使用 SELECT、UPDATE 等权限

  • ON 用来指定权限针对哪些库和表

  • TO 表示将权限赋予某个用户

  • 如果需要赋予包括 GRANT 的权限,添加参数 “ WITH GRANT OPTION " 这个选项即可,表示该用户可以将自 己拥有的权限授权给别人

  • GRANT 重复给用户添加权限,权限叠加,比如你先给用户添加一个 SELECT 权限,然后又给用户添加 一 个 INSERT 权限,那么该用户就同时拥有了 SELECT 和 INSERT 权限。

实践

  1. xiaou 用户授予 test 数据库所有表的 selectinsertdeleteupdate 权限

grant select,insert,update,delete on test.* to 'xiaou'@'%';
  1. xiaou2 用户授予所有数据库和表的全部权限

grant all privileges on *.* to 'xiaou2'@'localhost';

在开发应用的时候,经常会遇到一种需求,就是要根据用户的不同,对数据进行横向和纵向的分组。

  • 横向分组: 用户可以接触到的数据范围,比如:可以看到哪些表的数据

  • 纵向分组: 用户对接数据能访问到什么程度,比如可以查询、修改。

查看权限

语句

  1. 查看当前用户权限

SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
  1. 查看用户权限

SHOW GRANTS FOR 'user'@'主机地址';

收回权限

收回用户不必要的权限可以在一定程度上保证系统的安全性

在将用户账号从 user 表回收之前,应该要回收相应用户的全部权限

语句格式

REVOKE 权限1 [,权限2] ON 数据库名称.表名称 FROM '用户名'@'用户地址'

实践

1. 收回 xiaou2 用户所有数据库和表的全部权限

revoke all privileges on *.* from 'xiaou2'@'localhost';

权限表

MySQL 服务器通过 权限表 来控制用户对数据库的访问,权限表存放在 MySQL 数据库中。

MySQL 数据库系统会根据权限表的内容为每个用户赋予相应的权限。这些权限表中最重要的是 user表和 db 表。除此之外还有table_priv 表、column_priv 表、proc_priv 表等。在 MySQL启动时,服务器将这些数据库中权限消息读入内存

| 表名 | 描述 |

| ------------- | ------------------ |

| user | 用户账号及权限消息 |

| db | 数据库层级的权限 |

| table_priv | 表层级的权限 |

| column_priv | 列层级的权限 |

| proc_priv | 存储过程的权限 |

| global_grants | 动态全局授权 |