MySQL 8.0 正式版目前已发布,MySQL 8.0 增加了很多新的功能,具体可参考「MySQL 8.0 正式版 8.0.11 发布!」一文。
MySQL 8.0 在用户管理方面增加了角色管理,默认的密码加密方式也做了调整,由之前的 SHA1 改为了 SHA2。同时加上 MySQL 5.7 的禁用用户和用户过期的功能,MySQL 在用户管理方面的功能和安全性都较之前版本大大的增强了。
在本教程中,我们将介绍 MySQL 下用户管理上的一些新特性和如何使用角色来简化权限管理。
注:本教程大部分特性要 MySQL 8.0 + 以上版本才支持。
MySQL 用户管理
验证插件和密码加密方式的变化
在 MySQL 8.0 中,caching_sha2_password 是默认的身份验证插件而不是之前版本的 mysql_native_password,默认的密码加密方式是 SHA2 。
mysql> show variables like 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
1 row in set (0.00 sec)
mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| root | % | caching_sha2_password |
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session | localhost | mysql_native_password |
| mysql.sys | localhost | mysql_native_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)
如果需要保持之前的验证方式并保持之前版本的密码加密方式需要在配置文件 my.cnf 中修改以下配置项并重启服务后生效。
[mysqld]
default_authentication_plugin = mysql_native_password
注:此选项暂不支持 MySQL 8.0 动态修改特性。
将 MySQL 8.0 中已有的 SHA2 密码修改为 SHA1 的模式。
# 更新用户的密码加密方式为之前版本的方式
mysql> ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'password';
# 刷新权限
mysql> FLUSH PRIVILEGES;
注:如果没有特殊的原因,建议使用更安全的新加密方式。
用户授权和修改密码
MySQL 8.0 的用户授权语句和之前版本有所区别,老版本的常用授权语句在 MySQL 8.0 版本中 已不能使用,如使用旧版本授权语句会报错。
在 MySQL 8.0 用之前版本授权语句创建用户。
mysql> GRANT ALL PRIVILEGES ON *.* TO `mike`@`%` IDENTIFIED BY '000000' WITH GRANT OPTION;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY '000000' WITH GRANT OPTION' at line 1
在 MySQL 8.0 版本中正确授权语句。
mysql> CREATE USER 'mike'@'%' IDENTIFIED BY '000000';
mysql> GRANT ALL ON *.* TO 'mike'@'%' WITH GRANT OPTION;
密码过期时间管理
MySQL 从 5.6.6 开始引入密码自动过期的新功能,并在 MySQL 5.7.4 版本中改进了用户密码过期时间这个特性。现在可以通过一个全局变量 default_password_lifetime 来设置一个全局的自动密码过期策略。
default_password_lifetime 其默认值为 0,表示禁用自动密码过期。default_password_lifetime 的值如是是正整数 N ,则表示允许的设置密码生存周期 为 N,单位为天 。
default_password_lifetime 全局密码到期策略默认为永久,不过期。
mysql> show variables like 'default_password_lifetime';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| default_password_lifetime | 0 |
+---------------------------+-------+
1 row in set (0.00 sec)
如果你要建立一个全局策略,让所有用户的密码的使用期限为六个月,可在服务端配置文件 my.cnf 中修改 default_password_lifetime 配置项的值为 180。
[mysqld]
default_password_lifetime=180
如果你要恢复全局策略,让所有用户的密码永不过期,可在服务端配置文件 my.cnf 中修改 default_password_lifetime 配置项的值为 0。
[mysqld]
default_password_lifetime=0
default_password_lifetime 参数是支持永久动态设置的,你也可以用以下命令在 MySQL 命令行下直接设置生效。
# 设置默认密码过期策略为 180 天后过期
mysql> SET PERSIST default_password_lifetime = 180;
# 设置默认密码过期策略为永不过期
mysql> SET