15.7.1.10 设置密码语句
SET PASSWORD [FOR user] auth_option
[REPLACE 'current_auth_string']
[RETAIN CURRENT PASSWORD]
auth_option: {
= 'auth_string'
| TO RANDOM
}
SET PASSWORD 语句将 MySQL 用户账户的密码分配给。密码可以在语句中明确指定或由 MySQL 随机生成。语句还可以包含密码验证子句,该子句指定当前密码要被替换,和子句管理账户是否具有第二个密码。'
和 auth_string
''
each 表示一个明文(未加密)密码。current_auth_string
'
使用 SET PASSWORD
语句分配密码,而不是使用 ALTER USER
语句来进行账户修改,包括分配密码。例如:
ALTER USER user IDENTIFIED BY 'auth_string';
用于随机生成密码、密码验证和第二个密码的子句仅适用于使用内部存储认证插件的账户。对于使用外部认证系统的账户,密码管理必须在该系统中进行。关于内部认证存储的更多信息,请见 第8.2.15节,“密码管理”。
REPLACE '
子句执行密码验证。如果给定:current_auth_string
'
-
REPLACE
指定账户当前密码要被替换,为明文(未加密)字符串。 -
该子句必须给定,如果账户密码更改需要指定当前密码,以验证尝试更改密码的用户实际知道当前密码。
-
该子句是可选的,如果账户密码更改可能不需要指定当前密码。
-
语句失败,如果给定子句不匹配当前密码,即使子句是可选的。
-
REPLACE
只能在更改当前用户账户密码时指定。
关于通过指定当前密码进行密码验证的更多信息,请见 第8.2.15节,“密码管理”。
RETAIN CURRENT PASSWORD
子句实现双密码能力。如果给定:
-
RETAIN CURRENT PASSWORD
保留账户当前密码作为其第二个密码,替换任何现有第二个密码。新的密码成为主密码,但客户端可以使用账户连接到服务器使用主密码或第二个密码(除非新的密码由SET PASSWORD
语句指定为空,否则第二个密码将变为空)。 -
如果指定
RETAIN CURRENT PASSWORD
对于具有空主密码的账户,语句失败。 -
如果账户具有第二个密码,并且您没有指定
RETAIN CURRENT PASSWORD
,那么第二个密码将保持不变。
有关双重密码的使用,请参见第8.2.15节,“密码管理”。
SET PASSWORD
允许这些auth_option
语法:
-
= '
auth_string
'将账户分配给定的文字密码。
-
TO RANDOM
将账户分配给MySQL生成的随机密码。该语句也将返回明文密码,以便于用户或应用程序执行该语句时访问。
有关结果集和随机生成密码的特征,请见随机密码生成。
在某些情况下,SET PASSWORD
可能会记录在服务器日志或客户端日志中,如~/.mysql_history
,这意味着明文密码可能会被读取由拥有该信息的读取权限的人。有关服务器日志和控制的信息,请见第8.1.2.3节,“密码和日志”。类似地,关于客户端日志的信息,请见第6.5.1.3节,“mysql 客户端日志”。
SET PASSWORD
可以使用或不使用明确指定用户账户的FOR
子句:
-
使用
FOR
子句,语句将设置指定账户的密码,该账户必须存在:user
SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';
-
不使用
FOR
子句,语句将设置当前用户的密码:user
SET PASSWORD = 'auth_string';
任何连接到服务器的客户端都可以更改该账户的密码(特别是,您可以更改自己的密码)。要查看服务器认证您为哪个账户,请调用
CURRENT_USER()
函数:SELECT CURRENT_USER();
如果给定FOR
子句,账户名称将使用第8.2.4节,“指定账户名称”中描述的格式。例如:user
SET PASSWORD FOR 'bob'@'%.example.org' = 'auth_string';
账户名称的主机部分,如果省略,缺省为'%'
。
SET PASSWORD
将字符串解释为明文字符串,传递给与该账户关联的身份验证插件,并将插件返回的结果存储在 mysql.user
系统表中的账户行中。 (插件将机会将值哈希到它所期望的加密格式中。插件可能使用指定的值,不进行哈希操作。)
为命名账户设置密码(使用 FOR
子句)需要对 mysql
系统架构的 UPDATE
权限。为自己设置密码(非匿名账户,无 FOR
子句)不需要特殊权限。
修改次要密码的语句需要这些权限:
-
需要
APPLICATION_PASSWORD_ADMIN
权限来使用RETAIN CURRENT PASSWORD
子句的SET PASSWORD
语句,以便应用于自己的账户。该权限是因为大多数用户只需要一个密码。 -
如果账户要被允许为所有账户修改次要密码,应该授予
CREATE USER
权限,而不是APPLICATION_PASSWORD_ADMIN
。
当 read_only
系统变量启用时,SET PASSWORD
需要 CONNECTION_ADMIN
权限(或弃用的 SUPER
权限),此外还需要任何其他所需的权限。
关于设置密码和身份验证插件的更多信息,请见 第8.2.14节,“Assigning Account Passwords”,和 第8.2.17节,“Pluggable Authentication”。