Права пользователя Django на создание / повышение привилегий

У меня возникла следующая проблема: если я предоставлю пользователю штатное состояние и позволю ему создавать пользователей, но не создавать новые группы и назначать права доступа, он по-прежнему сможет назначать другому пользователю права администратора, поэтому он может легко добавить пользователь, который имеет больше прав, чем он сам! Кто-нибудь нашел способ избежать этого без предоставления пользовательской модели / вида?

Я благодарен за любой ответ.

1 ответ

Решение

Джанго требует, чтобы пользователи с разрешения Can add user также есть разрешение Can change user, Цитирование документации:

Также обратите внимание: если вы хотите, чтобы ваша собственная учетная запись могла создавать пользователей с помощью сайта администратора Django, вам нужно дать себе разрешение на добавление пользователей и изменение пользователей (т. Е. Разрешения "Добавить пользователя" и "Изменить пользователя").). Если у вашей учетной записи есть разрешение на добавление пользователей, но не на их изменение, вы не сможете добавлять пользователей. Зачем? Потому что, если у вас есть разрешение на добавление пользователей, вы можете создавать суперпользователей, которые могут, в свою очередь, изменять других пользователей. Таким образом, Django требует добавления и изменения разрешений в качестве небольшой меры безопасности.

Тем не менее, может быть возможно ограничить набор разрешений, доступных для данного пользователя для назначения путем изменения ModelAdmin (или его форма). Вот ответ, показывающий, как переопределить UserAdmin,

Я верю твоему новому ModelAdmin потребуется: а) отфильтровать пользователей, которые имеют больше разрешений, чем вы (поэтому вы не можете удалить разрешения от них); б) изменить форму изменения пользователя, чтобы вы не могли установить superuser поля и разрешения, которые вам не разрешено назначать, исключаются из списка (или вообще отключают весь список - но я не знаю, что вам действительно нужно, верно? Создание пользователя без каких-либо разрешений было бы бесполезным IMO),

Обновление: вот что я нашел до сих пор. Должно удовлетворять всем перечисленным выше целям, кроме проблемы с фильтрацией разрешений (она ведет себя так, как вы задали в вопросе - отрицать назначение каких-либо разрешений пользователям, не имеющим на это права). Вы можете изменить его в соответствии с вашими потребностями (например, заменить .is_superuser по любой логике вы хотите разрешить / запретить изменение разрешений).

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class MyUserAdmin(UserAdmin):
    def queryset(self,request):
        qs = admin.ModelAdmin.queryset(self,request)
        if request.user.is_superuser:
            return qs
        # Only allow viewing/editing users who are not superusers
        return qs.filter(is_superuser=False)
    def get_readonly_fields(self, request, obj=None):
        # Deny editing groups, permissions and the superuser status
        return () if request.user.is_superuser else ('is_superuser', 'groups', 'user_permissions')

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
Другие вопросы по тегам