用户和权限管理
MySQL 用户可以分为 普通用户 和 ROOT 用户, ROOT 用户具有所有权限包括创建用户、删除用户和修改用户的密码等管理权限,普通用户只能被授予各种权限。
登录
启动 MySQL 服务之后,可以通过 MySQL 命令来登录 MySQL 服务器命令格式如下:
mysql -h hostname|hostIP -P port -u username -p databases -e "SQL 语句"
-h 主机名或主机 IP
-P 端口
-u 用户名
-p 密码
databases: 指明需要登录哪一个数据库
-e 后面可以带 SQL 当 MySQL 服务器执行完后将会指定登出 MySQL 服务器
用户管理
创建用户
在 MySQL 数据库中,可以使用 CREATE USER
语句创建新的用户。
语句格式
CREATE USER 用户名 [IDENTIFIED BY '密码'][,IDENTIFIED BY '密码']
用户名参数表示新建用户的用户名,由
用户 (USER)
和主机名 (HOST)
构成CREATE USER
可以一次创建多个用户
实践
不填主机名
CREATE USER xiaou IDENTIFIED BY '123'
select user, host from user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| xiaou | % |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
从结果中可以看出默认 host
是 %
不设置密码
CREATE USER xiaou2
需要使用 mysql -u xiaou2
登录不能带 -p 否则会报错
完整创建用户
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 |
+---------------+-----------+
密码修改
使用
SET
语句来修改当前密码
SET PASSWORD='new_password';
SET PASSWORD='xiau123';
修改其他用户密码
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 |
权限授予原则
只授予满足需要最小权限,防止出现问题
创建用户的时候如果可以限制用户登录的主机那么一定要限制,一般指定IP或者内网。
定期清理不使用的用户,回收权限或删除用户
为每个用户都要设置较为复杂的密码
授予权限
GRANT 权限[,权限] ON 数据库名称.表名称 TO 用户名 [IDENTIFIED BY '密码'];
如果在授予权限的时候没有发现用户,则会直接创建一个用户
ALL PRIVILEGES 是表示所有权限,你也可以使用 SELECT、UPDATE 等权限
ON 用来指定权限针对哪些库和表
TO 表示将权限赋予某个用户
如果需要赋予包括 GRANT 的权限,添加参数 “
WITH GRANT OPTION
" 这个选项即可,表示该用户可以将自 己拥有的权限授权给别人GRANT 重复给用户添加权限,权限叠加,比如你先给用户添加一个 SELECT 权限,然后又给用户添加 一 个 INSERT 权限,那么该用户就同时拥有了 SELECT 和 INSERT 权限。
实践
给
xiaou
用户授予 test 数据库所有表的select
、insert
、delete
和update
权限
grant select,insert,update,delete on test.* to 'xiaou'@'%';
给
xiaou2
用户授予所有数据库和表的全部权限
grant all privileges on *.* to 'xiaou2'@'localhost';
在开发应用的时候,经常会遇到一种需求,就是要根据用户的不同,对数据进行横向和纵向的分组。
横向分组: 用户可以接触到的数据范围,比如:可以看到哪些表的数据
纵向分组: 用户对接数据能访问到什么程度,比如可以查询、修改。
查看权限
语句
查看当前用户权限
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
查看用户权限
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 | 动态全局授权 |