У нас есть система, которая работает так, как вы просили.
Программа имеет базовый пользовательский логин, который является базовым сайтом и использует рукописные представления и шаблоны (как это было необходимо длябыть) ... Существует часть Customer , которая является базовой страницей администратора с ограниченными правами доступа.И есть admin , кто я и такие же люди, как я.
Логика в том, что администраторы - это люди, работающие в компании, которые могут иметь все права доступа (суперпользователи, как сказал sjango) или ограниченный доступ.приложениям, но могут видеть все связанные записи БД из тех, к которым у них есть доступ.Клиенты - это люди, которым мы продаем нашу программу, они имеют ограниченный доступ к администратору и могут видеть только связанные с ними записи.пользователи являются клиентами наших клиентов ...
В этом случае разрешения django не являются достаточными, поскольку наш клиент должен видеть запись, принадлежащую его учетной записи, в то время как обычный администратор может видеть все записи,Эти два могут обращаться к приложениям в соответствии с их разрешениями.Суперпользователь может видеть и делать все, что угодно ...
Для решения вместо приложения сайта usnig django (которым я никогда не пользовался и у меня мало информации) мы создали модель, расширяющую пользователя Django, имеющую полекак role это роль пользователя является системным администратором, тогда он может видеть все (если он суперпользователь, в противном случае он использует разрешения как обычно) ... Если нет, он может получить доступ к записям, относящимся к их веб-сайту (компания в вашей ситуации).
Таким образом, почти каждая таблица базы данных должна иметь внешний ключ, определяющий компанию-владельца связанной записи.
Таким образом, вы можете при необходимости фильтровать записи, принадлежащие определенной компании ...
В моих моделях у меня есть Kullanici, который наследует модель пользователя
class Kullanici(User):
rol = SmallIntegerField()# 1 if system admin, 2 if cusotmer etc...
Затем я пишу несколько методов, которые переопределяют методы администратора, такие как ModelAdmin.save и modelAdmin.queryset, которые выполняют следующую проверку ...
#override admin queryset method
def override_queryset(obj, req):
qs = super(type(obj), obj).queryset(req)
kullanici = Kullanici.objects.get(id=req.user.id)
if kullanici.rol == 10:
return qs
return qs.filter(site=kullanici.site)
Таким образом, когда пользователь переходит к представлению списка приложения, он видит только сайты, связанные с ним, oЭти записи не будут показаны, или он получит ошибку, если попытается перейти к записи, принадлежащей другому сайту.Все эти элементы управления основаны на django, поэтому вы можете быть уверены, что они не достигнут муравейной записи, что они не должны.
Вы должны переопределить все методы администратора, требующие фильтрации, принадлежащие клиенту.
Для дальнейшегоограничение я использовал функцию, чтобы показать / скрыть поля модели.В файле admin .py:
class SomeModelAdmin(ModelAdmin):
exclude= []
def changelist_view(self, request, extra_context=None):
extra_context = {'exclude':['field1','field2']}
return get_admin_listview(self, request, extra_context)
def get_admin_listview(obj, req, extra):
system_admin = Kullanici.objects.get(id=req.user.id).rol == 1
if not system_admin:
if 'exclude' in extra.keys():
for key in extra['exclude']:
if key not in obj.exclude:
obj.exclude.add(key)
вы даете список имен полей, которые будут скрыты, и он будет скрывать их, если пользователь не является системным администратором ...
Handycaps,Может вызвать кеширование админки django, что случалось со мной один или два раза за 8 месяцев.Другой важной частью является то, что вы не можете ограничивать фильтры администратора, поэтому, если у вас есть фильтр, требующий ограниченного доступа, вы не можете фильтровать ключи фильтра.Вы можете либо отобразить его со всеми параметрами, либо просто не использовать его.
Если этот подход решит вашу проблему, я могу написать более подробную информацию ...
ОБНОВЛЕНИЕ: Да, система разрешенийпрост и безопасен, если вы проверяете исходный код license_required decorator из последнего кода соединительной линии ...
Логика проста, у пользователя есть соответствующее разрешение,связанный взглядВ противном случае связанный вид или код не выполняется вообще.Итак, permissons обеспечивает достаточную безопасность для администратора django.Контроль разрешений можно использовать как на уровне представления, так и / или на уровне шаблона.
Одна вещь, которая должна быть осторожна, - это рукописные представления, где небезопасный код может вызвать серьезные проблемы, но это все о вашем кодировании, иэто та угроза безопасности, с которой вы будете сталкиваться на всех платформах и языках программирования ...
Последняя проблема - механизм фильтрации страниц просмотра django и admin.Поскольку почти все административные фильтры используют GET для фильтрации данных и передают идентификаторы в URL для отображения конкретной записи. Секретная часть книги django показывает основную информацию о возможных проблемах безопасности и о том, как django их обрабатывает ... С другой стороны, 22 декабря 2010 г. Обновление безопасности показывает такую важную уязвимость, которая требуетдостаточно информации о структуре модели.