3

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

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

ответ

2

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

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

Однако возможно ограничить набор разрешений, доступных для данного пользователя, путем изменения ModelAdmin (или его формы). Вот an answer, показывающий, как переопределить 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) 
+1

Примечание: Я хотел бы дать вам более полный ответ, но у меня возникли проблемы с поиском правильной настройки «UserAdmin» или его форм. Я вернусь к этому позже, если найду что-нибудь полезное. (PS [это] (https://docs.djangoproject.com/en/1.0/ref/contrib/admin/#adding-custom-validation-to-the-admin) должно быть хорошей отправной точкой) – mgibsonbr

+0

Спасибо _very_ до сих пор! Думаю, много помогает! –