1. 创建用户
create user if not exists 'zhouxun'@'%' identified with mysql_native_password by 'zhouxun' with max_queries_per_hour 500 max_updates_per_hour 100;
-
if not exists : 如果用户已经存在了('zhouxun'@'%' 这部分一致 才认为是 用户存在), 则仅仅抛出异常信息,如果 不加次语句,用户已经存在会 抛出出错误。
如果查看 警告信息呢?执行:show warnings;
'zhouxun'@'%' :前面表示 用户名; % 表示 允许任意的 ip 地址访问。还可以指定 某个网段的 ip访问:10.148.%.%
mysql_native_password : 表示 此用户使用的 密码认证方式。mysql8.0 默认使用的 密码认证方式为 caching_sha2_password 但是mysql5.7 使用的是 mysql_native_password
max_queries_per_hour:表示用户 可以在 一小时内 执行的最大 查询次数
max_updates_per_hour:表示用户 可以在一小时内 执行的最大 更新次数
用户信息 存放于 数据库名为 mysql 下的 user 表中,某些时候 我们可能需要 自己修改此表。
当客户端连接的时候 会经历两个 阶段: 首先 调用 认证插件 进行 用户名和密码 验证,然后 进行 用户权限检查。
2. 授予用户 对 某个数据库的 查询权限
-
上一步中,我们创建了 zhouxun 这个用户,但是 这个 用户 现在没有任何权限,通过一下命令查看 用户权限:
use mysql; select * from user where User='zhouxun' \G;
-
现在 我们来 给 用户 赋予 对某个数据库的 查询权限
grant select on employees.* to 'zhouxun'@'%';
- select : 表示 仅仅是 查询 权限
- employees.* :点号 前面表示 对于哪个数据库的权限,后面的 * 表示 所有的表
-
给 用户 赋予 对 某个数据库的 插入数据,更新数据,删除数据 权限
grant insert,update,delete on employees.* to 'zhouxun'@'%';
3. GRANT 特权
一个用户 只有 拥有 GRANT 权限,才能 给 其他用户 设置权限。比如 我们使用的root 用户 就 拥有此 特权。
-
赋予某个用户 GRANT特权:
grant grant option on *.* to 'zhouxun'@'%';
4. ALL 权限
-
ALL 权限 表示 除了 GRANT 特权之外所有的 权限
grant all on *.* to 'zhouxun'@'%';
5. 查看某个用户的权限
show grants for 'zhouxun'@'%' \G;
6. 撤销 权限
- 撤销 用户 对 所有数据的 表的 删除权限。
revoke delete on *.* from 'zhouxun'@'%';
7. mysql.user 表
- 所有的用户信息和权限都存在于这个表中,如果你有 权限,可以通过 mysql.user 这个表来 创建用户和授权。
- 如果 使用 grant 、revoke、set password 或者 rename user 等 账户 管理语句 修改 授权表,则服务器会 立刻将 授权表 加载到内存中,也就是说,会立即生效。
- 如果使用 insert 、update、delete 等语句 直接修改 授权表,则 需要使用 flush privileges 来 重新加载 授权表。
8. 创建 带有 过期密码的 用户
-
通常是 管理员 给 开发人员 设置的 用户,这样的用户 在第一次 登录的时候 需要自己 重置密码。
create user 'dev'@'%' identified with mysql_native_password by '123' password expire;
- dev 用户 密码 过期 日期等于 mysql 环境变量 default_password_lifetime 的值。这个值 为 0. 所以密码会 立刻过期 。
当 我们使用 dev 用户 登录 进入之后,发现 没有不能执行 任何的操作。因为 没有重置密码。
-
我们来重置一下密码:
alter user 'dev'@'%' identified with mysql_native_password by 'dev123';
- 重置完 密码之后 就 可以正常使用mysql了(前提是 此用户已经配置好权限)
9. 手动 设置,使 用户过期
alter user 'dev'@'%' password expire;
10. 设置 用户 每隔90天 更改一次密码
alter user 'dev'@'%' password expire interval 90 day;
11. 锁定和解锁用户
-
如果发现 账户有异常,可以 把 用户锁定。
alter user 'dev'@'%' account lock;
- 锁定的用户 不能登录 mysql,并且会 报错。
-
解锁 用户
alter user 'dev'@'%' account unlock;
12. mysql 角色
mysql的角色是一个权限集合。角色的权限也可以被授予和撤销。用户被授予角色后,用户 会 拥有 和角色一样的 权限。通过这种方式,避免为许多用户 单独授予权限的麻烦。
-
创建角色
create role 'read_only';
-
为 角色 授予权限
grant select on employ.* to 'read_only';
-
为 用户 分配 角色
grant 'read_only' to 'dev'@'%';
- 为了安全,实际生成环境 不会使用 % 而是 限制 ip 访问。