2056816.jpg

用户的创建与授权

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)