[英]How to make Django admin site accessed by non-staff user?
我想实现第二个管理站点,它提供主管理站点的功能子集。 这是可能的,并在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')
不幸的是,这种方法不起作用。 用户可以登录,但在辅助管理站点中看不到任何内容。
这种方法有什么问题? 知道如何实现此功能吗?
提前致谢
我认为你的方法现在应该是可能的: 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 仅对活跃员工显示。 我假设这样做是因为登录表单也使用了这个模板,有人可以作为活跃的非工作人员登录,但仍然不应该看到这些链接。
这是对我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')
这种方法有什么问题? 知道如何实现此功能吗?
这种方法的错误在于权限和组已经可以为您提供所需的内容。 如果您只需要划分用户,则无需对 AdminSite 进行子类化。
恕我直言,这可能就是为什么此功能的记录如此糟糕的原因
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.