Django 用户在创建/权限提升方面的权利
Posted
技术标签:
【中文标题】Django 用户在创建/权限提升方面的权利【英文标题】:Django user entitlements on creation / privilege escalation 【发布时间】:2012-05-28 08:14:46 【问题描述】:我遇到了以下问题: 如果我给用户工作人员状态并允许他创建用户但不允许创建新组和分配权利,他仍然可以为另一个用户分配“管理员”权利 - 这样他就可以轻松添加拥有更多权利的用户比他自己! 有没有人在不提供自定义用户模型/视图的情况下找到避免这种情况的方法?
感谢您的任何回复。
【问题讨论】:
【参考方案1】:Django 要求拥有Can add user
权限的用户也拥有Can change user
权限。引用documentation:
另请注意:如果您希望自己的用户帐户能够使用 Django 管理站点创建用户,您需要授予自己添加用户和更改用户的权限(即“添加用户”和“更改用户”权限)。如果您的帐户有权添加用户但不能更改用户,您将无法添加用户。为什么?因为如果您有权添加用户,您就有权创建超级用户,然后超级用户可以更改其他用户。所以 Django 需要添加和更改权限作为轻微的安全措施。
但是,可以通过修改ModelAdmin
(或其形式)来限制给定用户可分配的权限集。这是an answer,展示了如何重新定义UserAdmin
。
我相信您的新 ModelAdmin
必须:a) 过滤掉比您拥有更多权限的用户(因此您不能删除他们的权限); b) 修改更改用户表单,以便您无法设置 superuser
字段,并且您不允许分配的权限从列表中排除(或完全禁用整个列表 - 但我不知道那是您真正需要的,对吧?创建一个完全没有权限的用户在 IMO 中用处不大)。
更新:这是我目前发现的。应该满足上述所有目标,除了权限过滤问题(它的行为就像您在问题中提出的那样 - 拒绝无权授予的用户分配 any 权限)。您可以对其进行修改以更好地满足您的需求(例如,将 .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)
【讨论】:
注意:我希望能给你一个更完整的答案,但我在找出如何正确自定义UserAdmin
或其表单时遇到了一些麻烦。如果我发现任何有用的东西,我稍后会回来。 (P.S.this 应该是一个很好的起点)
到目前为止非常感谢您非常!我觉得很有帮助!以上是关于Django 用户在创建/权限提升方面的权利的主要内容,如果未能解决你的问题,请参考以下文章