如何在 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.
我希望能够创建一个用户(在基于 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.