【问题标题】:How do I connect admin page in django with custom auth backend?如何将 django 中的管理页面与自定义身份验证后端连接?
【发布时间】:2015-06-27 11:40:28
【问题描述】:

我在我的 django 项目中使用了自定义身份验证后端来连接用户,我的问题是我无法再使用管理界面进行连接。 这是我的自定义身份验证文件: auth_backends.py:

from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model


class StudentModelBackend(ModelBackend):
def authenticate(self, username=None, password=None):
    try:
        user = self.user_class_s.objects.get(username=username)
        if user.check_password(password):
            return user
    except self.user_class_s.DoesNotExist:
        return None

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

@property
def user_class_s(self):
    if not hasattr(self, '_user_class'):
        self._user_class = get_model(*settings.CUSTOM_USER_MODEL.split('.', 2))
        if not self._user_class:
            raise ImproperlyConfigured('Could not get student model')
    return self._user_class


class ProfessorModelBackend(ModelBackend):
def authenticate(self, username=None, password=None):
    try:
        user = self.user_class_p.objects.get(username=username)
        if user.check_password(password):
            return user
    except self.user_class_p.DoesNotExist:
        return None

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

@property
def user_class_p(self):
    if not hasattr(self, '_user_class'):
        self._user_class = get_model(*settings.CUSTOM_USER_MODEL_P.split('.', 2))
        if not self._user_class:
            raise ImproperlyConfigured('Could not get student model')
    return self._user_class

settings.py:

AUTHENTICATION_BACKENDS = (
'authentification.auth_backends.StudentModelBackend',
'authentification.auth_backends.ProfessorModelBackend',
)

CUSTOM_USER_MODEL = 'forum.Student'
CUSTOM_USER_MODEL_P = 'forum.Professor'

我试过这个解决方案: 从 django.contrib.auth.decorators 导入 login_required

admin.autodiscover()
admin.site.login = login_required(admin.site.login)

但它会将我重定向到用户身份验证界面而不是管理界面。

有人可以帮帮我吗?

【问题讨论】:

    标签: django django-admin django-authentication


    【解决方案1】:

    默认的 login_required 装饰器将默认为 settings.py LOGIN_REDIRECT_URL。但是,您也可以通过传递 login_url 关键字参数来明确告诉它使用哪个登录视图。

    https://github.com/django/django/blob/stable/1.8.x/django/contrib/auth/decorators.py#L39

    这可以与通用 login_required 视图一起使用,下面的示例通过使用 user_passes_test 装饰器显示了更精确的条件。

    例如:

    from django.contrib.auth.decorators import user_passes_test
    
    def superuser_required(*args, **kwargs):
        return user_passes_test(lambda u: u.is_superuser, login_url='admin:login')(*args, **kwargs)
    
    def custom_login_required(*args, **kwargs):
        return user_passes_test(lambda u: getattr(u, 'is_custom_user', False), login_url='custom-url-name-from-urls-py')(*args, **kwargs)
    

    那么您应该可以像上面一样使用通用login_required 的新装饰:

    admin.site.login = custom_login_required(admin.site.login)
    

    【讨论】:

    • 谢谢你的回复,在这两种情况下:admin - 普通用户,他尝试使用我的普通用户自定义身份验证连接,如果用户是管理员,他无法连接,如何让他使用管理员身份时的默认身份验证后端
    【解决方案2】:

    我找到了解决方案, 如果用户不是学生或教授,我只需要告诉 django 尝试使用原始后端进行连接。 只需在 settings.py 中添加 'django.contrib.auth.backends.ModelBackend'

    settings.py:

    AUTHENTICATION_BACKENDS = (
    'authentification.auth_backends.StudentModelBackend',
    'authentification.auth_backends.ProfessorModelBackend',
    'django.contrib.auth.backends.ModelBackend',
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-24
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 2018-03-06
      • 2015-07-31
      • 1970-01-01
      相关资源
      最近更新 更多