没有密码的django认证

我在django中使用默认的身份验证系统,但是我在OpenID库上添加了一个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字段,这是登录所需的。


为此编写自定义身份验证后端很简单。 如果使用以下内容创建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)

这有点破解,但如果你不想重写一堆东西,删除身份验证

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

用户将是您的用户对象


您可以通过创建自己的身份验证后端并将其添加到AUTHENTICATION_BACKENDS设置来轻松解决此问题。

已经有一些OpenID后端可用了,所以通过一些搜索,你可以节省写一个的麻烦。

链接地址: http://www.djcxy.com/p/33757.html

上一篇: django authentication without a password

下一篇: Extending the User model with custom fields in Django