【问题标题】:Django - Read the current's user authentication backend classDjango - 读取当前的用户认证后端类
【发布时间】:2011-06-28 20:43:00
【问题描述】:

我在 Django 中使用自定义身份验证后端,从旧系统自动创建和登录用户。我的Backend 班级是这样的:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
from sfi.models import Employee
import base64, hashlib

class SFIUserBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        if not username or not password:
            return

        digest = base64.standard_b64encode(hashlib.md5(password).digest())
        user = None
        try:
            employee = Employee.objects.get(login=username, passwd=digest)
            user, created = User.objects.get_or_create(username=username)
            if created:
                # setting attributes
                user.first_name = employee.names[:30]
                user.last_name = employee.surnames[:30]
                user.is_staff = True
                user.save()
        except Employee.DoesNotExist:
            pass

        return user

到目前为止,它运行良好。但是,我需要在模板中读取当前登录用户的后端类。

使用request.user.backend 表示user 没有属性后端...并且我无法从会话中读取它(使用request.session._auth_user_backend)因为Django 模板系统抱怨“变量和属性可能不是以下划线”。

我使用django.contrib.auth.views.login 来允许用户登录。我错过了什么?

【问题讨论】:

标签: python django django-admin django-authentication django-contrib


【解决方案1】:

您应该在视图中阅读它并发送该类名称的适当人类形式作为消息。

【讨论】:

    【解决方案2】:

    当用户使用django.contrib.auth.authenticate(username='foo',password='bar') 函数进行身份验证时,backend 属性将添加到user 对象中。

    此函数依次调用您在settings.py 文件中指定的所有AUTHENTICATION_BACKENDS,直到它能够使用其中一个成功进行身份验证。

    如果您的用户已“登录”但没有backend 属性,这可能意味着您没有正确验证他们。也许你是直接调用 SFIUserBackend.authenticate 函数,而你应该调用 django.contrib.auth.authenticate 函数?

    看看这些custom authentication docs

    【讨论】:

    • user.backend 仅在登录请求中可用。
    【解决方案3】:

    虽然authenticate() 添加了user.backend 属性并且login() 将其保存在会话中,但出于某种原因get_user() 不会将其添加回用户。我有submitted a patch

    因此,为了在另一个请求中访问它,您需要request.session[django.contrib.auth.BACKEND_SESSION_KEY]

    您还可以编写自定义标签或将其添加到您的上下文中(以您想要的任何名称)以方便使用。

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 1970-01-01
      • 2017-02-22
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 2019-03-31
      相关资源
      最近更新 更多