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

Python 如何让非员工用户访问Django管理站点?,python,django,django-admin,django-authentication,Python,Django,Django Admin,Django Authentication,我想实施第二个管理网站,它提供了一个主管理网站的功能子集。这是可能的,并在 但是,我想限制对主管理站点的访问。有些用户可以访问第二个站点,但不能访问主站点 为了实现该功能,我希望这些用户不在staff(is_staff=False)中,并重写AdminSite.has_permission class SecondaryAdminSite(AdminSite): def has_permission(self, request): if request.user

我想实施第二个管理网站,它提供了一个主管理网站的功能子集。这是可能的,并在

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

为了实现该功能,我希望这些用户不在staff(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')
不幸的是,这种方法不起作用。用户可以登录,但在辅助管理站点中看不到任何内容

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

提前谢谢

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

这种方法的错误在于,权限和组已经可以为您提供所需的内容。如果只需要划分用户,就不需要将AdminSite子类化


这可能就是为什么这个功能的文档记录得如此糟糕的原因,IMHO

我认为您的方法现在应该是可行的:(5周前关闭)

但是,明确的“是员工”检查仍在两个地方进行(除了员工所需的装饰师):

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

    在“has_permission()”的基础上,您需要为您的非工作人员AdminSite提供一个“login_表单”,该表单不进行is_工作人员检查,因此可以对clean()进行相应的子类化和调整

  • templates/admin/base.html

    需要稍微定制一下。 id为“用户工具”的div仅为在职员工显示。我假设这样做是因为登录表单也使用了这个模板,有人可以作为活动的非工作人员登录,但仍然不应该看到这些链接


    • 以下是我使用
      Django>=3.2
      时所做的工作

      • 创建一个子类
        AdminSite
      • 覆盖
        has\u permission()
        方法以删除
        is\u staff
        检查
      • 覆盖
        登录表单
        以使用
        身份验证表单
        • AdminSite
          使用
          AdminAuthenticationForm
          ,它扩展了
          AuthenticationForm
          ,并添加了对
          is\U人员的检查
      代码
      #项目/APP/admin.py
      从django.contrib.admin导入AdminSite
      从django.contrib.admin.forms导入AuthenticationForm
      类MyAdminSite(AdminSite):
      """
      特定于应用程序的管理站点实现
      """
      登录表单=身份验证表单
      站点标题='Todomon'
      def具有_权限(自我、请求):
      """
      检查当前用户是否具有访问权限。
      """
      return request.user.u是否处于活动状态
      site=MyAdminSite(name='myadmin')
      
      为什么不将用户划分为超级用户、经理、客户等-权限系统工作得很好。@托马斯兹:我也在这样做。第二天的管理网站有不同的目的,所以解决不同类型的用户。我希望避免他们连接到通常的管理员。我假设您正在验证是否调用了正确的
      权限
      ?页面上是否没有显示任何内容(即完全空白),或者只是隐藏了管理功能?它表示我对此应用程序没有任何权限。如果我在登录的用户上恢复is_staff,他们可以看到模型。
      is_staff
      是管理员所必需的。如果您有一些原因说明这些用户不能将其设置为true,我认为您最好的选择是编写自己的管理视图。通过像
      has_permission
      decorator这样的访问控制,您可以强制执行自己的授权方案。第二级网站不仅仅是管理权限的一种不同方式。它提供自定义屏幕和附加功能。django管理站点很棒,可以高度定制。Stange这是一个有点难以定制的信息,我会给一个tryPlease让我知道你如何去,因为它是未经测试的,我想在某个阶段做同样的:-)回答票也如果这是所有你需要改变。要获得额外的布朗尼点数,您甚至可以在那里使用补丁,这样每个人都会受益!:)我认为我对AdminSite了解不够,无法创建补丁:-)。。。棘手的-AdminSite.login\u表单是一个AdminAuthenticationForm,但后者还没有一个属性来向“它的”AdminSite(多个用户可以共享同一个登录表单…)询问has\u权限()。。。这可以被传递到构造函数中,但我不知道后果是什么——用请求(cookies)和所有。。。模板也有同样的问题。根据具体情况,我可以将一段硬编码的代码与另一段硬编码的代码交换,通用解决方案更难。。。