django - 授予 “user change”权限时,如何防止Django admin中的权限升级?

标签 django permissions django-admin django-users

我有一个拥有大量客户群的django网站。我想让我们的客户服务部门能够更改普通用户帐户,执行更改密码,电子邮件地址等操作。但是,如果我授予某人内置的auth | user | Can change user权限,他们就可以设置is_superuser标志在任何帐户上,包括他们自己的帐户。 (!!!)

对于非 super 用户人员,删除此选项的最佳方法是什么?我确定它涉及子类化django.contrib.auth.forms.UserChangeForm并将其挂接到我已经自定义的UserAdmin对象中。但是我找不到有关如何执行此操作的任何文档,并且我对内部结构还不够了解。

最佳答案

they gain the ability to set the is_superuser flag on any account, including their own. (!!!)



不仅如此,他们还具有向自己授予任何权限的能力,效果相同...

I'm sure it involves subclassing django.contrib.auth.forms.UserChangeForm



好吧,不一定。您在django管理员的更改页面中看到的表单是由admin应用程序动态创建的,并且基于UserChangeForm,但是此类几乎没有将regex验证添加到username字段。

and hooking it into my already-custom UserAdmin object...



自定义UserAdmin是前往此处的方法。基本上,您想将fieldsets属性更改为类似的内容:
class MyUserAdmin(UserAdmin):
    fieldsets = (
        (None, {'fields': ('username', 'password')}),
        (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
        # Removing the permission part
        # (_('Permissions'), {'fields': ('is_staff', 'is_active', 'is_superuser', 'user_permissions')}),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
        # Keeping the group parts? Ok, but they shouldn't be able to define
        # their own groups, up to you...
        (_('Groups'), {'fields': ('groups',)}),
    )

但是这里的问题是此限制将适用于所有用户。如果这不是您想要的,则可以例如根据用户的权限重写change_view以使其行为不同。程式码片段:
class MyUserAdmin(UserAdmin):
    staff_fieldsets = (
        (None, {'fields': ('username', 'password')}),
        (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
        # No permissions
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
        (_('Groups'), {'fields': ('groups',)}),
    )

    def change_view(self, request, *args, **kwargs):
        # for non-superuser
        if not request.user.is_superuser:
            try:
                self.fieldsets = self.staff_fieldsets
                response = super(MyUserAdmin, self).change_view(request, *args, **kwargs)
            finally:
                # Reset fieldsets to its original value
                self.fieldsets = UserAdmin.fieldsets
            return response
        else:
            return super(MyUserAdmin, self).change_view(request, *args, **kwargs)

关于django - 授予 “user change”权限时,如何防止Django admin中的权限升级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2297377/

相关文章:

python - 如何更改 pisa 生成的 pdf 中的页面大小

django - Django Rest Framework如何访问序列化器中的字段

mysql - 设计高级权限系统

python-3.x - 如何使用 python reverse() 函数将 id 列表作为查询参数传递?

django - 如何在 Geodjango 的管理员中更改 map 的默认缩放级别?

django - admin.logentry : 'user' has a relation with model <class 'api.models.User' >, 尚未安装或抽象

python - django,基于位置的搜索

shell - 递归检查具有可执行位设置的文件

python Pyinstaller IOError : [Errno 13] Permission denied

python - 如何在 Eclipse 中运行 django 测试以使调试成为可能,但在测试数据库上