luc*_*luc 6 python django django-admin django-authentication
我想实现第二个管理站点,它提供主要管理站点的一部分功能.这是可能的,并在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')
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种方法不起作用.用户可以登录,但在辅助管理站点中看不到任何内容.
这种方法有什么问题?知道如何实现这个功能吗?
提前致谢
这对我有用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')
Run Code Online (Sandbox Code Playgroud)
我认为你的方法现在应该是可能的: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 仅针对活跃员工显示。我假设这已经完成,因为登录表单也使用此模板,并且某人可以作为活跃的非工作人员登录,但仍然不应该看到这些链接。
归档时间: |
|
查看次数: |
3907 次 |
最近记录: |