允许非超级管理员用户在 django admin 中为另一个用户重置密码

Allow non-superadmin users to reset the password for another user in django admin

我正在开发第三方应用 运行 django 2.2.12。

我的管理员有 3 种用户:"superadmin"、"staff" 和 "other"。

当我以 "superadmin" 身份登录时,当我转到“用户”列表并单击某个用户时,我可以编辑他们并重置他们的密码。

但是,当我尝试以 "staff" 用户的身份执行相同操作时,我可以看到用户数据,但无法编辑任何内容,也没有重置密码的选项。如果我尝试手动访问 URL (/admin/accounts/user/[USER_ID]/password/),我会收到“403 Forbidden”错误消息。

我注意到如果我重写用户模型中的 has_perm 方法,它允许 "staff" 用户编辑用户数据。但是,我只想允许更改密码(如果用户不是超级管理员或员工用户),而不允许 "staff" 用户编辑其他用户。

def has_perm(self, perm, obj=None):
    return True

我的印象是这与 Django 权限系统有关,但我重新阅读了 https://docs.djangoproject.com/en/2.2/topics/auth/default/ 的文档,但仍无法弄清楚。

谢谢

好的,我能够使用一个不太理想的解决方案使其工作,但成功了。

基本上我重载了 UserAdmin class 的 has_change_permission 方法并添加了自定义逻辑以允许在特殊情况下更改密码(url 以 ' /password' 并且用户具有正确的权限。

    def can_edit_password(self, logged_user, chosen_user=None):
        if logged_user and logged_user.is_superuser:
            return True

        logged_user_has_change_pass_perm = (
            logged_user and
            logged_user.is_authenticated and
            logged_user.has_perm("accounts.change_student_password")
        )
        return logged_user_has_change_pass_perm

    def can_show_change_password_form(self, path, logged_user, chosen_user=None):
        is_changing_password = path.endswith('/password/')
        return is_changing_password and self.can_edit_password(logged_user, chosen_user)

    def has_change_permission(self, request, user=None):
        if self.can_show_change_password_form(path=request.path, logged_user=request.user, chosen_user=user):
            return True
        return super(UserAdmin, self).has_change_permission(request, user)