如何让非员工用户访问Django管理站点?

时间:2010-10-26 09:57:01

标签: python django django-admin django-authentication

我想实现第二个管理站点,它提供主要管理站点的一部分功能。这是可能的,并在Django docs

中进行了描述

但是,我想限制主要管理网站上的访问权限。有些用户可以访问第二站点,但不能访问主站点。

为了实现该功能,我希望这些用户不在员工中(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')

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

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

提前致谢

3 个答案:

答案 0 :(得分:2)

我认为您的方法现在应该可行: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仅显示给活跃的工作人员。我假设已完成,因为登录表单也使用此模板,有人可以作为活动的非工作人员登录,但仍然不应该看到这些链接。

答案 1 :(得分:0)

以下是对我有用的 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')

答案 2 :(得分:-1)

  

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

这种方法出了什么问题,权限和群组已经可以为您提供所需的内容。如果您只需要划分用户,则无需将AdminSite子类化。

这可能就是为什么这个功能记录如此糟糕,恕我直言