11

我想实现第二个管理站点,它提供主管理站点的功能子集。这是可能的,并在Django 文档中进行了描述

但是,我想限制对主管理站点的访问。一些用户可以访问第二个站点,但不能访问主站点。

为了实现该功能,我希望这些用户不在员工中(is_staff=False)并重写AdminSite.has_permission

class SecondaryAdminSite(AdminSite):
    
    def has_permission(self, request):
        if request.user.is_anonymous:
            try:
                username = request.POST['username']
                password = request.POST['password']
            except KeyError:
                return False
            try:
                user = User.objects.get(username = username)
                if user.check_password(password):
                    return user.has_perm('app.change_onlythistable')
                else:
                    return False
            except User.DoesNotExist:
                return False
        else:
            return request.user.has_perm('app.change_onlythistable')

不幸的是,这种方法行不通。用户可以登录,但在辅助管理站点中看不到任何内容。

这种方法有什么问题?知道如何实现此功能吗?

提前致谢

4

3 回答 3

4

我认为您的方法现在应该可行:http ://code.djangoproject.com/ticket/14434 (5 周前关闭)

但是,显式的“is_staff”检查仍然在两个地方进行(除了 staff_member_required 装饰器):

  • django.contrib.admin.forms.AdminAuthenticationForm.clean()

    在“has_permission()”之上,您需要为您的非员工 AdminSite 提供一个不进行 is_staff 检查的“login_form”,因此可以子类化并相应地调整 clean()。

  • 模板/管理员/base.html

    需要稍微定制。id 为“user-tools”的 div 仅显示给在职员工。我假设已经完成,因为登录表单也使用此模板,并且有人可以作为活跃的编外人员登录,但仍然不应该看到这些链接。

于 2011-04-06T22:21:13.867 回答
3

这对我有用Django >= 3.2

  • 创建一个子类AdminSite
  • 覆盖has_permission()删除is_staff检查的方法。
  • 覆盖login_form要使用的AuthenticationForm.
    • AdminSite使用AdminAuthenticationForm,它扩展AuthenticationForm并添加了对 . 的检查is_staff

代码

# PROJECT/APP/admin.py

from django.contrib.admin import AdminSite
from django.contrib.admin.forms import AuthenticationForm


class MyAdminSite(AdminSite):
    """
    App-specific admin site implementation
    """

    login_form = AuthenticationForm

    site_header = 'Todomon'

    def has_permission(self, request):
        """
        Checks if the current user has access.
        """
        return request.user.is_active


site = MyAdminSite(name='myadmin')

于 2021-05-22T16:24:00.090 回答
-1

这种方法有什么问题?知道如何实现此功能吗?

这种方法的问题在于权限和组已经可以为您提供所需的内容。如果您只需要划分用户,则无需对 AdminSite 进行子类化。

恕我直言,这可能就是为什么此功能的文档记录如此糟糕的原因

于 2010-12-01T23:14:10.420 回答