首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >允许非超级管理员用户在django admin中重置另一个用户的密码。

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

Stack Overflow用户
提问于 2020-04-21 02:33:29
回答 1查看 289关注 0票数 0

我正在开发一个第三方应用程序,运行django 2.2.12。

我有一个管理员与3种用户:“超级管理员”,“工作人员”和“其他”。

当我被记录为“超级管理员”时,当我进入用户列表并点击一个用户时,我能够编辑他们并重置他们的密码。

但是,当我尝试与"staff“用户做同样的操作时,我可以看到用户数据,但是不能编辑任何内容,并且没有任何选项可以重置密码。如果我尝试手动访问URL (/admin/accounts/user/[USER_ID]/password/),就会收到"403禁忌“错误消息。

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

代码语言:javascript
复制
def has_perm(self, perm, obj=None):
    return True

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-22 02:15:39

好吧,我可以用一个不太理想的解决方案来解决这个问题,但是我做到了。

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

代码语言:javascript
复制
    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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61335067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档