资讯

展开

MySQL8.0---Create user的那些属性

作者:快盘下载 人气:

mysql8.0---Create user的那些属性

01MySQL8.0.27版本简介

MySQL目前最新版本是8.0.27,今天下载了一个,尝尝鲜。这个版本,更像是一个bug 修复版本,修复了200多个bug。

看到这个结果,如果你线上版本要选择8.0系列,建议避开8.0.26和8.0.27,这其中的原因是:

第一,8.0.26版本bug太多,不建议作为线上;

第二,8.0.27修复了这些bug,所以代码变动比较多,不建议用这样的版本作为线上版本。

我主要对这个Create User这个语法感兴趣,这里谈两点改变:

第一,create user和alter user语法,支持定义多种认证方法;

第二,用户程序可以使用--password1,--password2,--password3三个密码来登录MySQL

但是这个内容后面会专门用文章去讲解,今天主要来看create user里面那些冗长复杂的属性

02create user语法

我简单写了个create user语法,还是有很多的收获的。

mysql> create user yeyz@'10.%';
ERROR 4031 (HY000): The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior.
No connection. Trying to reconnect...
Connection id:    1606616
Current database: *** NONE ***

Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> show create user yeyz@'10.%';
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER for yeyz@10.%                                                                                                                                                                                       |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER `yeyz`@`10.%` IDENTIFIED WITH 'mysql_native_password' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

1、红色提示部分,直接给我们提示由于连接不活跃,MySQL Server断开连接,需要考虑是否是wait_timeout和interactive_timeout参数,这一点更加人性化了。

2、在MySQL8.0.27中,一个账号具有很多属性,例如:

IDENTIFIED WITH 'mysql_native_password':认证方法

可以选择下面3种,

mysql_native_password

sha256_password

caching_sha2_password

其中默认值是caching_sha2_password,从安全性角度说,它比另外的方法更安全,但是为了和低版本5.7兼容,更倾向于选择mysql_native_password,因为mysql_native_password是MySQL5.7的默认加密方法

REQUIRE NONE:是否加密客户端连接

如果你的MySQL需要对当前的客户连接加密,需要通过ssl模式连接,这个时候,在客户端就需要配置 --ssl-mode=REQUIRED,从而支持加密连接。如果Require选项是None,代表当前连接不加密。

PASSWORD EXPIRE DEFAULT:密码过期策略

这里采用默认的密码过期策略,默认的策略下,密码过期取决于参数default_password_lifetime,而这个参数的取值可以是0,代表不过期,也可以是一个数字N,代表N天过后,必须修改密码。

mysql> show variables like '%default_password_lifetime%';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| default_password_lifetime | 0     |
+---------------------------+-------+
1 row in set (0.00 sec)

除此之外,还可以取其他的值,例如

password expire never:密码永远不过期;

password expire INTERVAL N DAY:密码在N天后过期

password expire:密码立即过期(也不知道这功能想干啥)

Account Unlock:账号是否被锁定

通常情况下,创建一个账号的时候,可以去指定这个账号的锁定状态,在线上环境中,一个账号一般是不被锁定的,如果一个账号被锁定了,再去尝试连接这个账号,就会出现如下报错:

Access denied for user 'user_name'@'host_name'.
Account is locked.

在一些特殊场景下,我们可以通过暂时锁定某些账号,来将部分业务请求拦截在数据库外面。

PASSWORD HISTORY default :密码使用次数策略

这个属性代表当前数据库是否支持密码重复使用,后面可以跟两个值,分别是default和整数N。

如果是整数N,说明密码可以和之前的第N次密码相同;例如我们第一次设置密码aaa,第二次密码bbb,第三次密码ccc,如果N=3,那么我们在ccc密码过期之后,第四次密码就可以再设置为aaa;

如果N>3,代表第四次密码还不能设置为aaa,因为aaa是历史上最近的

如果是使用default,代表密码使用历史策略取决于password_history系统变量,如下:

mysql> show variables like '%password_history%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| password_history | 0     |
+------------------+-------+
1 row in set (0.00 sec)

这里的0代表不设限,其他数字,跟上述描述一致。

注意:设定了具体的N之后,系统变量将会被忽略。

PASSWORD REUSE INTERVAL:密码使用时间策略

这个属性,跟上述属性类似,只不过是时间维度的,后面可以跟具体的天数N或者默认值default。

如果是具体的天数N:代表这个账号可以在N天内被使用,超过之后,必须换密码

CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 360 DAY;

上述案例代表密码可以被使用360天。

如果是default,那么具体的天数,取决于系统变量password_reuse_interval,如下:

mysql> show variables like '%password_reuse_interval%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| password_reuse_interval | 0     |
+-------------------------+-------+
1 row in set (0.01 sec)

注意:设定了具体的N之后,系统设置将会被忽略。

PASSWORD REQUIRE CURRENT:是否需要原密码认证

这个属性控制的是修改密码的时候,是否需要原来的密码认证,默认是不需要,它的取值可以是:空、optional或者default

如果后面什么都不跟,也就是空,则代表需要指定原来的密码才能够修改其他用户密码

如果选择的是optional,则不需要指定原来的密码,就能够修改其他用户的密码

如果选择的是default,则具体的行为,取决于password_require_current参数,如果是off,代表不需要原来的密码,如果是on,则代表需要原来的密码;

mysql> show variables like '%password_require_current%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| password_require_current | OFF   |
+--------------------------+-------+
1 row in set (0.00 sec)

注意,如果定义了optional或者空,则系统变量password_require_current会被忽略。

另外,如果一个账号有create user权限或者有mysql.user表的update权限,则可以直接修改其他账号的密码,而不需要原来的密码。

简单总结一下:

利用Create user语法创建账号的时候,针对账号的密码本身,可以定义下面7个属性:

1、密码加密方式

2、是否加密客户端连接

3、账号密码是否有过期策略

4、账号是否被锁定

5、密码历史次数策略

6、密码使用天数策略

7、修改密码是否需要原密码策略

这些属性当然可以设置为默认,通常也是这么做的,但是MySQL8.0中引入的这些特性,可以在某些具体场景下,提高密码安全性和可用性。

加载全部内容

相关教程
猜你喜欢
用户评论
快盘暂不提供评论功能!