用户的创建与授权
MySQL5.7
mysql> grant select,insert,update,delete on sbtest.* to test_user@'%' identified by 'mysql';
Query OK, 0 rows affected, 1 warning (0.04 sec)
MySQL8.0
mysql> grant select,insert,update,delete on sbtest.* to test_user@'%' identified by 'mysql';
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 'mysql'' at line 1
mysql> create user test_user identified by 'mysql';
Query OK, 0 rows affected (0.06 sec)
mysql> grant select,insert,update,delete on sbtest.* to test_user@'%';
Query OK, 0 rows affected (0.05 sec)
可以看到:MySQL5.7一条授权语句可以完成用户创建和授权,而MySQL8.0必须将用户创建和授权分成两个语句。
认证插件的更新
MySQL5.7默认身份插件是mysql_native_password MySQL8.0默认的身份插件是caching_sha2_password MySQL5.7
mysql> show variables like 'default_authentication_plugin%';
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| default_authentication_plugin | mysql_native_password |
+-------------------------------+-----------------------+
1 row in set (0.00 sec)
MySQL8.0
mysql> show variables like 'default_authentication_plugin%';
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
1 row in set (0.00 sec)
身份认证插件可以通过以下2中方式改变:
1)系统变量default_authentication_plugin去改变,在my.ini文件的[mysqld]下面设置default_authentication_plugin=mysql_native_password即可 2)如果希望只是某一个用户通过mysql_native_password的方式认证,可以修改数据库mysql下面的user表的字段,执行以下命令:
mysql> alter user 'test_user'@'%' identified with mysql_native_password by 'mysql';
Query OK, 0 rows affected (0.05 sec)
密码管理
MySQL8.0的密码管理策略有3个变量 password_history: 修改密码不允许与最近几次使用或的密码重复,默认是0,即不限制 password_reuse_interval: 修改密码不允许与最近多少天的使用过的密码重复,默认是0,即不限制 password_require_current: 修改密码是否需要提供当前的登录密码,默认是OFF,即不需要;如果需要,则设置成ON 查询当前MySQL密码管理策略相关变量,使用以下命令:
mysql> show variables like 'password%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| password_history | 0 |
| password_require_current | OFF |
| password_reuse_interval | 0 |
+--------------------------+-------+
3 rows in set (0.00 sec)
1)设置全局的密码管理策略,在my.cnf配置文件中,设置以上3个变量的值这种设置方式,需要重启MySQL服务器;某些生产环境不允许重启,MySQL8.0提供了关键字persist,持久化,执行以下命令:
mysql> set persist password_history=6;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'password%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| password_history | 6 |
| password_require_current | OFF |
| password_reuse_interval | 0 |
+--------------------------+-------+
3 rows in set (0.00 sec)
这条命令会在数据目录下生成新的配置文件,下次服务器重启的时候除了读取全局配置文件,还会读取这个配置文件,这条配置就会被读入从而达到持久化的目的。 2)针对某一个用户单独设置密码管理策略
mysql> alter user 'test_user'@'%' password history 5;
Query OK, 0 rows affected (0.04 sec)
test_user的这样,这个用户的password_history就被设置成了5,如下:
mysql> select user,host,password_reuse_history from mysql.user where user='test_user';
+-----------+------+------------------------+
| user | host | password_reuse_history |
+-----------+------+------------------------+
| test_user | % | 5 |
+-----------+------+------------------------+
1 row in set (0.00 sec)