0%

创建用户/修改密码/PASSWORD() 方法

创建用户

  • CREATE USER 创建用户

    1
    mysql> CREATE USER 'test'@'localhost' IDENTIFIED BY 'aA1!bB2@';
  • GRANT 创建用户并赋予权限

    1
    mysql> GRANT ALL PRIVILEGES ON item TO 'test'@'localhost' IDENTIFIED BY 'aA1!bB2@';

PASSWORD() 会被自动应用在密码字段,用于对密码加密

1
2
3
4
5
6
mysql> select User, authentication_string from user where user = 'test';
+------+-------------------------------------------+
| User | authentication_string |
+------+-------------------------------------------+
| test | *D6FCEA391DD697FE52A83D74A44512FC26967FB7 |
+------+-------------------------------------------+

其中 *D6FCEA391DD697FE52A83D74A44512FC26967FB7 对应 ‘aA1!bB2@’ 加密后的字段

1
2
3
4
5
6
mysql> select password('aA1!bB2@');
+-------------------------------------------+
| password('aA1!bB2@') |
+-------------------------------------------+
| *D6FCEA391DD697FE52A83D74A44512FC26967FB7 |
+-------------------------------------------+

修改密码

修改密码方式有两种,通过alter命令或直接修改user表。

  • ALTER USER

    1
    mysql> ALTER USER 'test'@'localhost' IDENTIFIED BY 'aA1!bB2@';
  • SET PASSWORD

    1
    mysql> SET PASSWORD FOR 'test'@'localhost' = PASSWORD('aA1!bB2@');
  • UPDTE user

    1
    2
    3
    mysql> UPDATE user SET authentication_string = PASSWORD('aA1!bB2@') where user = 'test';

    mysql> FLUSH PRIVILEGES;
1
2
3
# 另一种使命令生效的方式
# mysqladmin reaload: Reload grant tables
$ mysqladmin -u root -p reload

区别:

  • UPDATE user 方式需要手动调用PASSWORD()方法
  • UPDATE user 方式需要额外调用 FLUSH PRIVILEGES 使权限生效,若忽略,则修改无效
  • SET PASSWORD 是否显示调用PASSWORD()方法均可

PASSWORD() 方法

MySQL内部默认对用户密码加密的函数。

  • CREATE USER/GRANT/ALTER USER 命令中,均不需要显式调用 PASSWORD() 方法,若多此一举会报语法错误
  • UPDATE user 方式直接修改密码时,需要手动调用(不推荐这种修改密码的方式

密码策略限制

1
2
3
# 当前版本 MySQL 8.0
mysql> GRANT ALL PRIVILEGES ON item TO 'test'@'localhost' IDENTIFIED BY '123456';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

在以上涉及到显式、隐式调用PASSWORD()时,若密码不满足MySQL系统设置的密码复杂度,会报错。
若将上面UPDATE user 命令改为

1
mysql> UPDATE user SET authentication_string = 'aA1!bB2@' where user = 'test'

则不会报错。(此处只是用作例子,这种方式修改密码,将导致用户无法登陆)
由此可知系统密码复杂度是直接应用在PASSWORD()方法上

注意

不同MySQL版本,处理可能略有不同,灵活处理,操作完记得验证一下