Mysql SET PASSWORD语句

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年7月11日 (二) 08:50的版本 (创建页面,内容为“ 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'和'curr…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索
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'和'current_auth_string'分别表示明文(未加密)密码。


注意:
与使用SET PASSWORD分配密码相比,ALTER USER是首选的账户修改语句,其中包括分配密码。例如:

ALTER USER user IDENTIFIED BY 'auth_string';
注意:
对于使用将凭据内部存储到MySQL的认证插件的账户,仅适用随机密码生成、密码验证和辅助密码的子句。对于使用针对与MySQL外部的凭据系统执行身份验证的插件的账户,密码管理必须在该系统中外部处理。


REPLACE 'current_auth_string'子句执行密码验证,并在MySQL 8.0.13中可用。如果给出:


  • REPLACE指定要替换的账户当前密码,作为明文(未加密)字符串。


  • 如果需要为账户更改密码来指定当前密码以验证实际知道当前密码的用户,必须提供此子句。


  • 如果账户更改密码可以但不需要指定当前密码,则该子句是可选的。


  • 如果给出了该子句,但是与当前密码不匹配,即使该子句是可选的,语句也将失败。


  • 只有在更改当前用户的账户密码时才能指定REPLACE。


RETAIN CURRENT PASSWORD子句实现了双密码功能,从MySQL 8.0.14版本开始可用。如果指定:


  • RETAIN CURRENT PASSWORD将保留账户当前的密码作为其次要密码,并替换任何现有的次要密码。新密码成为主要密码,但客户端可以使用该账户使用主要密码或次要密码连接到服务器。(例外情况:如果由SET PASSWORD语句指定的新密码为空,则次要密码也变为空,即使指定了RETAIN CURRENT PASSWORD。)


  • 如果对一个空主要密码的账户指定RETAIN CURRENT PASSWORD,则该语句失败。


  • 如果一个账户有次要密码,并且你在不指定RETAIN CURRENT PASSWORD的情况下更改其主要密码,则次要密码保持不变。


SET PASSWORD允许以下auth_option语法:


  • = 'auth_string'

将给定字面密码分配给账户。


  • TO RANDOM

将随机生成的密码分配给账户,并将明文密码作为结果集返回,以便用户或执行该语句的应用程序使用。


随机密码生成功能从MySQL 8.0.18版本开始可用。

重要提示:
在某些情况下,SET PASSWORD操作可能会被记录在服务器日志中或客户端一侧的历史文件(比如~/.mysql_history),这意味着明文密码可能被任何有读取权限的人读取。


SET PASSWORD可以使用FOR子句来明确指定用户账户,也可以不使用FOR子句。


使用FOR user子句时,该语句会设置指定账户的密码,该账户必须存在:

SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';


如果没有使用FOR user子句,该语句会设置当前用户的密码:

SET PASSWORD = 'auth_string';


任何使用非匿名账户连接到服务器的客户端都可以更改该账户的密码(特别是可以更改自己的密码)。要查看服务器对您进行身份验证的账户,可以调用CURRENT_USER()函数:

SELECT CURRENT_USER();


如果给出了FOR user子句,则账户名称采用特定的格式。例如:

SET PASSWORD FOR 'bob'@'%.example.org' = 'auth_string';


如果省略了账户名中的主机名部分,默认为'%'。


SET PASSWORD将字符串解释为明文字符串,并将其传递给与该账户关联的认证插件,然后将插件返回的结果存储在mysql.user系统表中的账户行中。(插件有机会将值哈希为期望的加密格式。插件可以按照指定的值使用,这种情况下不发生哈希操作。)


通过FOR子句设置命名账户的密码需要对mysql系统模式具有UPDATE权限。对于自己(没有FOR子句的非匿名账户)设置密码不需要特殊权限。


修改次要密码的语句需要以下权限:


  • 使用RETAIN CURRENT PASSWORD子句来应用于自己账户的SET PASSWORD语句,需要APPLICATION_PASSWORD_ADMIN权限。此权限用于操作自己的次要密码,因为大多数用户只需要一个密码。


  • 如果某个账户可以管理所有账户的次要密码,则该账户应授予CREATE USER权限,而不是APPLICATION_PASSWORD_ADMIN。


  • 当启用read_only系统变量时,SET PASSWORD除了其他所需的权限外,还需要CONNECTION_ADMIN权限(或已弃用的SUPER权限)。