0

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

当我向用户授予用户添加权限时,我看到该用户默认获得“权限添加”选项(尽管我没有授予该用户的“权限添加”权限)。我观察到这个新用户也有权创建一个超级用户(这非常令人惊讶)

4

1 回答 1

0

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

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

为了实现您想要的,您需要更改openwisp-users 模块的 UserAdmin 类

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

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:我已经在 openwisp-users 模块中包含了这个功能(加上测试和改进)

于 2017-08-07T11:00:21.723 回答