我希望能够创建一个用户(在基于django的openwisp2中),反过来,他可以创建另一个用户,但不能为该用户授予个人权限。只允许此新用户授予预定义的组权限。
当我向用户提供用户添加权限时,我看到此用户默认获得“权限添加”选项(尽管我没有为此用户授予“权限添加”权限)。我观察到这个新用户有权创建一个超级用户(这是非常令人惊讶的)
答案 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
这些更改实现了以下三个方面:
这些更改也可以集成在 openwisp2 中。如果可以的话,尽情享受并尝试贡献(例如:在openwisp-users中打开问题或提出请求)!
PS:I've included this feature (plus tests and improvements) in the openwisp-users module。