Разрешения Django для каждого объекта
У меня есть пользователи, которые связаны со списком объектов недвижимости, к которым им разрешен доступ. У нескольких пользователей может быть разрешение на просмотр одного и того же сайта.
Как мне установить это в django?
У меня есть:
class UserProfile(models.Model):
user = models.OneToOneField(User)
last_session_time_online = models.IntegerField()
total_time_online = models.IntegerField()
def __unicode__(self):
return self.user
и
class Site(models.Model):
site_name = models.CharField(max_length = 512)
...Other stuff...
def __unicode__(self):
return self.user
Ответы
Ответ 1
Это основной материал для многих:
class Site(models.Model):
site_name = models.CharField(max_length = 512)
allowed_users = models.ManyToManyField(User)
...
sam = User.objects.get(username = 'sam')
frodo = User.objects.get(username = 'frodo')
hobbithole = Site.objects.get(site_name = 'The Hobbit Hole')
hobbithole.allowed_users.add(sam, frodo)
frodo.site_set.all() # Should return "The Hobbit Hole" object, and any other place frodo allowed to visit.
somesite.allowed_users.exists(user = frodo) # returns True if frodo is in the site set of allowed users.
Если вы не хотите загромождать Site
, вы также можете создать промежуточную таблицу "через". Это создает слой косвенности, но позволяет вам добавлять вещи в сквозную таблицу, например, степени разрешения, если хотите. Вы можете использовать функцию auth
module groups
в этой таблице, чтобы определить "группы, которые имеют доступ к ключам" и "группы, которые могут изменять свойство" и т.д.
Много для многих полей в Django
Ответ 2
Это появилось недавно, но я не могу найти соответствующий вопрос о SO. Вместо этого вот некоторые ссылки, которые я сохранил из этого обсуждения, чтобы прочитать позже:
Ответ 3
Теперь Django поддерживает разрешения объектов. Кроме Обработка разрешений объектов, связанная с другим ответом, REST Рамочное руководство по разрешениям стоит прочитать.
Вам нужно добавить код в подкласс Meta
вашей модели для каждого разрешения:
class Meta:
permissions = (
('edit_this_model', 'Edit this model'),
)
Если вы используете юг, вам может потребоваться запустить manage.py syncdb --all
после обновления модели.
Чтобы проверить подлинность пользователя, используйте команду, например:
user.has_perm('your_app_name. edit_this_model')
Ответ 4
Множество плагинов здесь, которые делают это.
Ответ 5
Попробуйте Django-Guradian. Вы можете использовать его для назначения прав доступа к объектам для пользователей/групп.