我遇到了以下问题: 如果我给用户员工状态并允许他创建用户但不创建新组并分配权利,他仍然可以为另一个用户分配'admin'权利 - 这样他就可以轻松添加拥有更多权利的用户比他自己! 如果没有提供自定义用户模型/查看,有没有人找到避免这种情况的方法?
我很感谢你的回应。
答案 0 :(得分:2)
Django要求拥有权限Can add user
的用户也拥有权限Can change user
。引用documentation:
另请注意:如果您希望自己的用户帐户能够使用Django管理站点创建用户,则需要允许自己添加用户和更改用户(即“添加用户”和“更改”用户“权限”。如果您的帐户有权添加用户但不能更改用户,则无法添加用户。为什么?因为如果您有权添加用户,则可以创建超级用户,然后可以更改其他用户。所以Django需要添加和更改权限作为一种轻微的安全措施。
但是,可以通过修改ModelAdmin
(或其表单)来限制给定用户可用的权限集。以下an answer显示了如何重新定义UserAdmin
。
我相信您的新ModelAdmin
必须:a)过滤掉拥有比您更多权限的用户(因此您无法从中移除权限); b)修改更改用户表单,以便您无法设置superuser
字段,并且不允许您分配的权限从列表中排除(或完全禁用整个列表 - 但我不知道那是你真正的需要,对吗?创建一个没有权限的用户对IMO没什么用处。
更新:这是我到目前为止所发现的。应该满足上述所有目标,除了权限过滤问题(它的行为与您在问题中提到的行为一样 - 拒绝为无权使用的用户分配任何权限)。您可以对其进行修改以更好地满足您的需求(例如,通过您想要允许/拒绝更改权限的任何逻辑替换.is_superuser
。)
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
class MyUserAdmin(UserAdmin):
def queryset(self,request):
qs = admin.ModelAdmin.queryset(self,request)
if request.user.is_superuser:
return qs
# Only allow viewing/editing users who are not superusers
return qs.filter(is_superuser=False)
def get_readonly_fields(self, request, obj=None):
# Deny editing groups, permissions and the superuser status
return () if request.user.is_superuser else ('is_superuser', 'groups', 'user_permissions')
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)