Django 管理员权限 - 可以编辑用户但无法编辑其权限 - 如何实现?
我给编辑们设置了这样的权限:
auth | user | 可以添加/修改用户 - 开启
auth | permissions | 可以添加/修改权限 - 关闭
但是,在编辑的时候,他们还是可以修改自己的权限(并允许自己做一些不该做的事情)。我找到了一张两年前的票据:http://code.djangoproject.com/ticket/6519,而且现在还是这样。
我想允许用户编辑(比如邮箱、密码等),但又想阻止他们修改权限,该怎么做呢?
2 个回答
3
下面的代码让你可以重写表单设置,这样就限制了普通用户修改权限的能力。普通用户仍然可以创建新用户,但他们不能更改权限。不过,他们可以正常编辑用户信息。
#admin.py
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.admin import UserAdmin
class UserAdmin(UserAdmin):
# this is for only editing/change/update only please keep in mind that
# the user can create superuser that can do everything
# so we will do the same for the add_view too
def change_view(self, request, object_id):
# we want to limit the ability of the normal user to edit permissions.
if request.user.is_superuser:
self.fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'user_permissions')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
(_('Groups'), {'fields': ('groups',)}),
)
else:
self.fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
#(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'user_permissions')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
#(_('Groups'), {'fields': ('groups',)}),
)
# this is for creating
def add_view(self, request):
# we want to limit the ability of the normal user to create permissions.
if request.user.is_superuser:
self.add_fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'user_permissions')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
(_('Groups'), {'fields': ('groups',)}),
)
else:
self.add_fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
#(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'user_permissions')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
#(_('Groups'), {'fields': ('groups',)}),
)
return super(UserAdmin, self).change_view(request)
当我提到“普通用户”时,我是指那些拥有 is_staff 权限的用户,他们可以访问管理后台。
2
我怕你现在的方法行不通。
根据Django的文档:
如果你有权限添加用户,那你就有能力创建超级用户,而这些超级用户可以更改其他用户的权限。
所以,如果你设法阻止编辑者更改权限,这也没用,因为他们仍然可以创建超级用户,而这些超级用户是可以更改权限的。