2015-05-29 3 views
3

У меня есть класс модели Department с полем name. У меня есть еще одна модель Student с внешним ключом до Department. Я хочу контролировать доступ к Student объектам на основе отдела. То есть, пользователь с разрешением на редактирование отдела с именем «CS» может редактировать только эти поля. Как это может быть достигнуто в Django? (Я использую Django 1.8, python3)Контроль доступа django на основе значения поля модели

Редактировать

class Department(models.Model): 
    name = models.CharField(_('department name'), max_length=255) 

class Students(models.Model): 
    first_name = models.CharField(_('first name'), max_length=30) 
    last_name = models.CharField(_('last name'), max_length=30) 
    department = models.ForeignKey('Department') 

Кроме того, я создание необходимых разрешений динамически при добавлении нового отдела (например, если department.name для новой записи является «CS », 2 'разрешения, как будут созданы view_CS' и 'edit_CS')

+0

Пожалуйста, покажите вашу модель. –

+2

https://github.com/lukaszb/django-guardian – madzohan

+0

@TonyYang добавить модели. – Rohith

ответ

2

на основе http://django-guardian.readthedocs.org/en/v1.2/userguide/assign.html#for-group

Где-то в представлениях:

from django.contrib.auth.models import Group 

cs_department = Department.objects.get(name='cs_department') 
cs_department_group = Group.objects.create(name=cs_department.name) 

assign_perm('view', cs_department_group, cs_department) 
assign_perm('edit', cs_department_group, cs_department) 

request.user.groups.add(cs_department_group) 

print(request.user.has_perm('view', cs_department)) # True 
print(request.user.has_perm('edit', cs_department)) # True 
-1

Поскольку мое приложение довольно большое, я не могу себе изменить целые ссылки данных для размещения прав доступа как @ madaohan отвечают.

Такого рода механизмы контроля доступа могут быть легко использованы определения диспетчер модели (docs) и промежуточное программное обеспечение, чтобы войти в систему объекта пользователя в моделях (Check this link),

+0

Я не понимаю, что вы имеете в виду, «меняя целые ссылки на данные для размещения разрешений». Также неясно, как ваши ссылки могут помочь решить ваши проблемы. Самопринятие столь слабого ответа пахнет рыбным. – tobltobs

+0

Я сделал это с заказными менеджерами моделей. Первая ссылка - это документы django для пользовательских менеджеров моделей. Чтобы получить информацию о пользователе в диспетчере моделей, мне пришлось использовать промежуточное программное обеспечение (см. Вторую ссылку). Он решил мою проблему, поэтому я написал ее здесь и сам принял ее. Во всяком случае, я изменил принятие этого ответа. @tobltobs, что я имел в виду «изменение целых ссылок на данные для размещения разрешений», заключается в том, что я не мог изменить каждый доступный код db для добавления разрешений, поэтому я использовал настраиваемый диспетчер моделей. – Rohith