Django 用户创建/权限升级的权利

问题描述 投票:0回答:1

我遇到以下问题: 如果我给予用户员工身份并允许他创建用户但不允许创建新组和分配权利,他仍然可以为另一个用户分配“管理员”权利 - 这样他就可以轻松添加拥有更多权利的用户比他自己! 有没有人找到一种方法来避免这种情况而不提供自定义用户模型/视图?

我很感谢您的回复。

django authorization administrator entitlements privilege-escalation
1个回答
2
投票

Django 要求拥有

Can add user
权限的用户也拥有
Can change user
权限。引用文档

另请注意:如果您希望自己的用户帐户能够使用 Django 管理站点创建用户,您需要授予自己添加用户和更改用户的权限(即“添加用户”和“更改用户”)权限)。如果您的帐户有权添加用户但无权更改用户,则您将无法添加用户。为什么?因为如果您有权添加用户,您就有权创建超级用户,然后超级用户可以更改其他用户。因此 Django 需要添加和更改权限作为一项轻微的安全措施。

但是,可以通过修改

ModelAdmin
(或其形式)来限制给定用户可分配的权限集。这是答案,展示了如何重新定义
UserAdmin

我相信您的新

ModelAdmin
必须:a)过滤掉比您拥有更多权限的用户(这样您就无法从他们那里删除权限); b)修改更改用户表单,以便您无法设置
superuser
字段,并且您不允许分配的权限将从列表中排除(或完全禁用整个列表 - 但我不知道这就是您真正需要的,对吧?创建一个完全没有权限的用户在我看来没什么用处)。

更新:这是我迄今为止发现的内容。应该满足上述所有目标,除了权限过滤问题(它的行为就像您在问题中提出的那样 - 拒绝无权用户授予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)
© www.soinside.com 2019 - 2024. All rights reserved.