没有密码的django身份验证

时间:2011-07-02 23:34:01

标签: django authentication openid

我正在使用django的默认身份验证系统,但我添加了一个OpenID库,我可以通过OpenID对用户进行身份验证。我想要做的是登录,但似乎使用默认的django auth系统,我需要他们的密码来验证用户。有没有办法绕过这个而不实际使用他们的密码?

我想做这样的事......

user = ... # queried the user based on the OpenID response
user = authenticate(user) # function actually requires a username and password
login(user)

我很快就离开authenticate函数,但它会附加一个backend字段,登录时需要该字段。

4 个答案:

答案 0 :(得分:22)

为此编写自定义身份验证后端很简单。如果使用以下内容创建yourapp / auth_backend.py:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User


class PasswordlessAuthBackend(ModelBackend):
    """Log in to Django without providing a password.

    """
    def authenticate(self, username=None):
        try:
            return User.objects.get(username=username)
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

然后添加到您的settings.py:

AUTHENTICATION_BACKENDS = (
    # ... your other backends
    'yourapp.auth_backend.PasswordlessAuthBackend',
)

在您看来,您现在可以在没有密码的情况下调用身份验证:

user = authenticate(username=user.username)
login(request, user)

答案 1 :(得分:8)

这有点像黑客,但如果你不想重写一堆东西,请删除身份验证

user.backend = 'django.contrib.auth.backends.ModelBackend'
login(request, user)

用户将是您的用户对象

答案 2 :(得分:2)

您可以通过创建自己的authentication backend并将其添加到AUTHENTICATION_BACKENDS设置来轻松解决此问题。

已经有一些OpenID后端可用,所以通过一些搜索,你可以省去写一个。

答案 3 :(得分:0)

为了不使用密码进行身份验证:

在您的settings.py中:

AUTHENTICATION_BACKENDS = [
# auth_backend.py implementing Class YourAuth inside yourapp folder
    'yourapp.auth_backend.YourAuth', 
# Default authentication of Django
    'django.contrib.auth.backends.ModelBackend',
]

在您的auth_backend.py中:

#如果您有应用的自定义模型,则从.models CustomUser导入

from .models import User 
from django.conf import settings




# requires to define two functions authenticate and get_user

class YourAuth:  

    def authenticate(self, request, username=None):
        try:
            user = User.objects.get(username=username)
            return user
        except User.DoesNotExist:
            return None

        return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

在您的视图中用于自定义登录请求:

# Your Logic to login user
userName = authenticate(request, username=uid)
login(request, userName)

有关参考,请参见https://docs.djangoproject.com/en/2.1/topics/auth/customizing/