我希望能够创建一个用户(在基于 django 的 openwisp2 中),该用户反过来可以创建另一个用户,但不能为该用户授予个人权限。只应允许此新用户授予预定义的组权限。
当我向用户授予用户添加权限时,我看到该用户默认获得“权限添加”选项(尽管我没有授予该用户的“权限添加”权限)。我观察到这个新用户也有权创建一个超级用户(这非常令人惊讶)
我希望能够创建一个用户(在基于 django 的 openwisp2 中),该用户反过来可以创建另一个用户,但不能为该用户授予个人权限。只应允许此新用户授予预定义的组权限。
当我向用户授予用户添加权限时,我看到该用户默认获得“权限添加”选项(尽管我没有授予该用户的“权限添加”权限)。我观察到这个新用户也有权创建一个超级用户(这非常令人惊讶)
不幸的是,由于默认的 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 件事:
这些更改也可以集成到openwisp2中。如果可以,请尽情享受并尝试做出贡献(例如:在openwisp-users中打开问题或拉取请求)!