Python 如何让非员工用户访问Django管理站点?
我想实施第二个管理网站,它提供了一个主管理网站的功能子集。这是可能的,并在 但是,我想限制对主管理站点的访问。有些用户可以访问第二个站点,但不能访问主站点 为了实现该功能,我希望这些用户不在staff(is_staff=False)中,并重写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
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)和所有。。。模板也有同样的问题。根据具体情况,我可以将一段硬编码的代码与另一段硬编码的代码交换,通用解决方案更难。。。