TL;DR
- ドキュメントの password_require_current だけ読むとちょっと足りなくて、実際にはこんな判定
if (mysqlスキーマへのUPDATE権限 || CREATE USER権限)
return パスワード確認不要;
else
{
if (global.password_require_currentがON || そのアカウントが mysql.user.Password_require_current = 'Y' になっている)
return パスワード確認必要;
else
return パスワード確認不要;
}
- パスワード確認必要な場合、パスワードを変えるようなステートメントの最後に
REPLACE '元のパスワード'
をつける - 対話的に聞かれるわけではない
REPLACE
をつけないとMySQL error code MY-013226 (ER_MISSING_CURRENT_PASSWORD): Current password needs to be specified in the REPLACE clause in order to change it.
と言われる- これをよく読むと実はちゃんと書いてある
最初、ずっと
root@localhost
でやってて全然反映されないな…と思ってたら、 特定の権限がある場合はこれ効かないのであった。一般ユーザーのみ。mysql80 28> SELECT user, host, password_require_current FROM mysql.user WHERE user = 'yoku0825';
+----------+------+--------------------------+
| user | host | password_require_current |
+----------+------+--------------------------+
| yoku0825 | % | NULL |
+----------+------+--------------------------+
1 row in set (0.00 sec)
mysql.user.
Password_require_currentの取りうる値は
NULL(
NULLは値じゃない…けど取り敢えず許して),
Y,
N` 。Y
は「REPLACE句がないとエラー」、 N
は「REPLACE句はあってもなくても良い」(ただし、REPLACE句を書いた上で元のパスワードを間違えるとエラー)、 NULL
は「 global.password_require_current
の値に従う」。
ユーザー作成時の暗黙のデフォルトは
NULL
Y
, N
, NULL
に対応する ALTER USER
ステートメントはこんな感じで、こっちの句を見るとそれぞれ要求する、あってもなくてもいい、システム設定に従う、みたいな感じがして良い。mysql80 28> ALTER USER yoku0825 PASSWORD REQUIRE CURRENT; -- 'Y'にする
Query OK, 0 rows affected (0.04 sec)
mysql80 28> SELECT user, host, password_require_current FROM mysql.user WHERE user = 'yoku0825';
+----------+------+--------------------------+
| user | host | password_require_current |
+----------+------+--------------------------+
| yoku0825 | % | Y |
+----------+------+--------------------------+
1 row in set (0.00 sec)
mysql80 28> ALTER USER yoku0825 PASSWORD REQUIRE CURRENT OPTIONAL; -- 'N'にする
Query OK, 0 rows affected (0.03 sec)
mysql80 28> SELECT user, host, password_require_current FROM mysql.user WHERE user = 'yoku0825';
+----------+------+--------------------------+
| user | host | password_require_current |
+----------+------+--------------------------+
| yoku0825 | % | N |
+----------+------+--------------------------+
1 row in set (0.00 sec)
mysql80 28> ALTER USER yoku0825 PASSWORD REQUIRE CURRENT DEFAULT; -- NULLにする
Query OK, 0 rows affected (0.07 sec)
mysql80 28> SELECT user, host, password_require_current FROM mysql.user WHERE user = 'yoku0825';
+----------+------+--------------------------+
| user | host | password_require_current |
+----------+------+--------------------------+
| yoku0825 | % | NULL |
+----------+------+--------------------------+
1 row in set (0.00 sec)
最初のサンプルっぽいところで
パスワード確認必要
になる組み合わせで、REPLACE句を指定しないでパスワードを触ろうとするとこうなる。mysql80 31> SET PASSWORD = 'yoku0825';
ERROR 13226 (HY000): Current password needs to be specified in the REPLACE clause in order to change it.
mysql80 31> SET PASSWORD = 'yoku0825' REPLACE 'old_password';
Query OK, 0 rows affected (0.03 sec)
ただし、権限があるアカウントでも
パスワード確認不要
の組み合わせでも、もとのパスワードを間違えるとこうなる。mysql80 31> SET PASSWORD = 'yoku0826' REPLACE 'wrong_password';
ERROR 13225 (HY000): Incorrect current password. Specify the correct password which has to be replaced.
0 件のコメント :
コメントを投稿