您的位置:

django出现NotSupportedError("SHA224 is not supported on Oracle.")的解决方案

  发布时间:2023-03-29 12:23:13
报错的原因这个错误是由于Django在连接到Oracle数据库时尝试使用SHA加密算法,但Oracle不支持这种加密算法。在settings.py中配置或者将设置为如果您使用Django版本高于3.2,并且使用Django自带的user model,更换上述选项是不能解决问题的。使用管理员账号登录oracle, 执行以下操作这样就会停止使用SHA加密算法。如果你使用的是 Oracle Cloud , 则需要联系 Oracle Cloud 支持人员来帮助修改数据库密码策略。此外, 你可以尝试使用django-pyodbc-azure等其它数据库连接库,来代替Django的默认的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连接方式。

希望这些信息能够帮助你解决你遇到的问题。