Разрешить пользователям не-superadmin сбросить пароль для другого пользователя в django admin - PullRequest
0 голосов
/ 21 апреля 2020

Я работаю над сторонним приложением, работающим django 2.2.12.

У меня есть администратор с 3 видами пользователей: "superadmin", "staff" и "other".

Когда я вошел в систему как "superadmin", когда я go в списке пользователей и щелкаю пользователя, я могу редактировать их и сбрасывать их пароль.

Однако, когда я пытаюсь сделать так же, как «штатный» пользователь, я могу видеть данные пользователя, но не могу ничего редактировать, и нет возможности сбросить пароль. Если я пытаюсь получить доступ к URL-адресу вручную (/admin/accounts/user/[USER_ID]/password/), я получаю сообщение об ошибке «403 Forbidden».

Я заметил, что если я переопределяю метод has_perm в модели пользователя, это позволяет «персоналу» "пользователь для редактирования пользовательских данных. Однако я хотел бы разрешить только изменение пароля (если пользователь не является суперадмином или сотрудником), не позволяя «штатным» пользователям редактировать других пользователей.

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

У меня сложилось впечатление, что это связано с системой разрешений Django, но я перечитал документы по адресу https://docs.djangoproject.com/en/2.2/topics/auth/default/ и пока не могу понять это .

Спасибо

1 Ответ

0 голосов
/ 22 апреля 2020

Хорошо, я смог заставить его работать не с идеальным решением, но сделал свое дело.

В основном я перегружаю метод has_change_permission класса UserAdmin и добавляю собственный лог c, чтобы разрешить изменение пароля в особом случае (URL оканчивается на «/ пароль», и у пользователя есть правильные разрешения.

    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)
...