django出现NotSupportedError("SHA224 is not supported on Oracle.")的解决方案
报错的原因
这个错误是由于Django在连接到Oracle数据库时尝试使用SHA224加密算法,但Oracle不支持这种加密算法。你需要解决的方法是更改Django的密码验证方式为Oracle支持的算法。
You can change it to 'scram-sha-256' or 'scram-sha-1'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '1521',
'OPTIONS': {
'authentication_method':'scram-sha-256',
},
}
}
另外,如果您不需要对密码进行加密,可以将AUTHENTICATION_BACKENDS设置为django.contrib.auth.backends.AllowAllUsersModelBackend。
如何解决
解决这个问题的一种方法是在Django的数据库设置中更改密码验证方式。
1. 在settings.py中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '1521',
'OPTIONS': {
'authentication_method':'scram-sha-256',
},
}
}
2. 或者将AUTHENTICATION_BACKENDS设置为django.contrib.auth.backends.AllowAllUsersModelBackend
AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.AllowAllUsersModelBackend']
如果您使用Django版本高于3.2,并且使用Django自带的user model,更换上述选项是不能解决问题的。此时建议使用`django-oracle-auth` 来解决这个问题
pip install django-oracle-auth
并在settings.py中设置
AUTHENTICATION_BACKENDS = ['oracle_auth.backends.OracleAuthBackend']
这是最简单的解决方案,希望能够帮助您解决这个问题
另外, 如果上述方法都不行,你可以在你需要使用到的oracle数据库中修改默认的密码策略。
1. 使用管理员账号登录oracle, 执行以下操作:
ALTER PROFILE default LIMIT PASSWORD_VERIFY_FUNCTION NULL;
这样就会停止使用SHA224加密算法。
如果你没有管理员权限并不能执行上述语句,你可以联系你公司/部门的DBA或者系统管理员来帮你执行这个操作。
如果你使用的是 Oracle Cloud , 则需要联系 Oracle Cloud 支持人员来帮助修改数据库密码策略。
总之, 这是一个很复杂的问题, 上述方法之一一定能够解决您的问题, 如果有任何问题请随时给我留言。
使用例子
是的,以下是一个使用scram-sha-256作为认证方式的示例:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'XE',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '1521',
'OPTIONS': {
'authentication_method':'scram-sha-256',
},
}
}
如果使用Django-oracle-auth
AUTHENTICATION_BACKENDS = ['oracle_auth.backends.OracleAuthBackend']
这些设置将告诉Django使用scram-sha-256作为密码验证的方式, 而不是使用不支持的SHA224.
请注意, 你需要确保oracle服务器中设置了scram-sha-256, 如果不支持你可能会得到一个新的错误。
还有, 如果需要其它方式来解决这个问题, 可以尝试修改Oracle中的密码验证策略。
还有一种解决方案就是使用django-cx_Oracle 库
你可以在你项目里安装它
pip install django-cx_Oracle
在Django的settings.py文件中, 你需要设置
DATABASES = {
'default': {
'ENGINE': 'django_cx_oracle',
'NAME': 'orcl',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '1521',
}
}
这个库在Django与Oracle连接时会使用cx_Oracle库来连接数据库, cx_Oracle库会忽略密码加密算法这个问题,因此你可以避免使用SHA224这个问题。
此外, 你可以尝试使用django-pyodbc-azure等其它数据库连接库,来代替Django的默认的oracle连接方式。
希望这些信息能够帮助你解决你遇到的问题。