Разрешения 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. Вы можете использовать его для назначения прав доступа к объектам для пользователей/групп.