Django/MySQL-python - 使用旧的(4.1.1之前的)身份验证协议拒绝连接(启用客户端选项'secure_auth')

sle*_*cal 6 python mysql django

很多人都在SO上遇到过这个问题,但几乎所有答案都没用.

Traceback (most recent call last):
  File "/venv/local/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 91, in inner_run
    self.validate(display_num_errors=True)
  File "/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 266, in validate
    num_errors = get_validation_errors(s, app)
  File "/venv/local/lib/python2.7/site-packages/django/core/management/validation.py", line 103, in get_validation_errors
    connection.validation.validate_field(e, opts, f)
  File "/venv/local/lib/python2.7/site-packages/django/db/
backends/mysql/validation.py", line 14, in validate_field
    db_version = self.connection.get_server_version()
  File "/venv/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 415, in get_server_version
    self.cursor().close()
  File "/venv/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 306, in cursor
    cursor = self.make_debug_cursor(self._cursor())
  File "/venv/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 387, in _cursor
    self.connection = Database.connect(**kwargs)
  File "/venv/local/lib/python2.7/site-packages/MySQLdb/__init__.py", line 81, in Connect
    return Connection(*args, **kwargs)
  File "/venv/local/lib/python2.7/site-packages/MySQLdb/connections.py", line 193, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
_mysql_exceptions.OperationalError: (2049, "Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)")
Run Code Online (Sandbox Code Playgroud)

小智 25

对于管理服务器连接,连接选项卡,高级子选项卡中的MySQL Workbench 6.08,您必须选中" 使用旧的身份验证协议 " 框.

在此输入图像描述


Mar*_*uiz 13

尝试与mysql命令行客户端连接时遇到同样的问题,我可以通过--skip-secure-auth选项避免错误.

例如:

mysql DBNAME -h HOST_NAME_OR_IP -u DB_USER --password="PASSWORD" --skip-secure-auth
Run Code Online (Sandbox Code Playgroud)

与其他mysqlX命令相同的参数mysqldump.


sle*_*cal 8

经过多次试验/错误后,问题被缩小为使用旧加密方式的密码.

mysql> select User, Password from mysql.user;
| user1           | *113D91F3A36D29C287C457A20D602FA384B8569F |
| user2           | 5d78f2535e56dfe0 |
Run Code Online (Sandbox Code Playgroud)

像Navicat这样的工具不会自动使用更新的样式密码,你必须明确地告诉它不要使用旧样式(在Navicat中,它叫做Advanced/Use OLD_PASSWORD tncryption) - 这就是我们被绊倒的地方.

如果你使用的是mysql shell,你可以使用;

mysql> update mysql.user set password=PASSWORD("NEWPASSWORD") where User='testuser';
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select User, Password from mysql.user WHERE user = 'testuser';
| testuser | *B845F78DCA29B8AE945AB9CFFAC24A9D17EB5063 |
Run Code Online (Sandbox Code Playgroud)

如果要查找受此问题影响的所有用户;

mysql> SELECT Host, User, Password FROM mysql.user WHERE LENGTH(Password) = 16;
Run Code Online (Sandbox Code Playgroud)

某些版本的Django不允许您secure-auth在选项中使用,但对于您可以使用的那些;

'OPTIONS': {
    'secure-auth': False
}
Run Code Online (Sandbox Code Playgroud)

如果它不受支持,将导致;

TypeError: 'secure-auth' is an invalid keyword argument for this function
Run Code Online (Sandbox Code Playgroud)

对于那些将来遇到麻烦的人来说,这应该是一个快速的答案.