如何在django中创建可以创建其他用户但不授予权限(仅授予预定义组权限)的用户?

时间:2017-08-02 11:44:35

标签: django django-admin django-authentication django-users openwisp

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

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

1 个答案:

答案 0 :(得分:0)

不幸的是,由于默认的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

这些更改实现了以下三个方面:

  • 为非超级用户(也称为运营商)
  • 创建is_superuser字段readonly
  • 将超级用户隐藏到用户列表中的非超级用户
  • 明确禁止将超级用户的详细信息更改为非超级用户(也称为运营商)

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

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