如何在 Django 中创建一个可以创建另一个用户但不能授予权限(仅授予预定义组权限)的用户?

How to create a user who can create another user but not grant permissions(only grant predefined group permissions) in django?

我希望能够创建一个用户(在基于 django 的 openwisp2 中),该用户又可以创建另一个用户但不能为该用户授予个人权限。对于这个新用户,应该只允许授予预定义的组权限。

当我给一个用户添加权限时,我看到这个用户默认获得了'permission add'选项(尽管我没有为这个用户授予'permission adding'权限)。我观察到这个新用户也有创建超级用户的权限(这很令人惊讶)

不幸的是,由于默认的 django 用户和权限系统的工作方式,无法使用 OpenWISP 2 立即实现您想要的功能。

一旦用户有权添加和更改用户的详细信息,他也将能够添加/删除其他用户的超级用户标志。 因此,该权限应仅授予受信任的用户。

为了达到你想要的效果,你需要改变UserAdmin class of the openwisp-users module

我已经尝试了这些似乎效果很好的更改:

class UserAdmin(BaseUserAdmin, BaseAdmin):
    # ... omitting existing code for brevity ...

    def get_readonly_fields(self, request, obj=None):
        # retrieve readonly fields
        fields = super(UserAdmin, self).get_readonly_fields(request, obj)
        # do not allow operators to set the is_superuser flag
        if not request.user.is_superuser:
            fields += fields[:] + ['is_superuser']  # copy to avoid modifying reference
        return fields

    def has_change_permission(self, request, obj=None):
        # do not allow operators to edit details of superusers
        # returns 403 if trying to access the change form of a superuser
        if obj and obj.is_superuser and not request.user.is_superuser:
            return False
        return super(UserAdmin, self).has_change_permission(request, obj)

    def get_queryset(self, request):
        qs = super(UserAdmin, self).get_queryset(request)
        # hide superusers from operators (they can't edit their details)
        if not request.user.is_superuser:
            qs = qs.filter(is_superuser=False)
        return qs

这些更改实现了以下 3 件事:

  • 使 is_superuser 字段对非超级用户(也称为操作员)只读
  • 在用户列表中向非超级用户隐藏超级用户
  • 明确禁止将超级用户的详细信息更改为非超级用户(也称为操作员)

这些更改也可以集成到 openwisp2 中。如果可以,请享受并尝试做出贡献(例如:在 openwisp-users 中打开问题或拉取请求)!

PS: I've included this feature (plus tests and improvements) in the openwisp-users module.