Django每对象权限

Django每对象权限,django,django-models,rbac,Django,Django Models,Rbac,我有一些用户,每个人都与允许他们访问的房地产列表相关联。多个用户可能具有查看同一站点的权限 我要如何在django建立这个 我有: class UserProfile(models.Model): user = models.OneToOneField(User) last_session_time_online = models.IntegerField() total_time_online = models.IntegerField() def __unic

我有一些用户,每个人都与允许他们访问的房地产列表相关联。多个用户可能具有查看同一站点的权限

我要如何在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

这是基本的多对多内容:

 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's allowed to visit.

 somesite.allowed_users.exists(user = frodo) # returns True if frodo is in the site's set of allowed users.
如果您不想让
站点变得杂乱无章
,还可以创建一个中间的“直通”表。这将创建一个间接层,但如果需要,允许您向through表添加权限级别之类的内容。您可以使用该表上的
auth
模块的
groups
功能来定义“可以访问密钥的组”和“可以修改属性的组”等等


这是最近才提出来的,但我找不到相关的问题。以下是我从讨论中保存的一些链接,供以后阅读:

  • -Django文件
  • -俄勒冈州立大学开放源码实验室
  • -华盛顿时报

有很多插件可以做到这一点

Django现在支持对象权限。此外,在另一个答案中与之相关的是,这本书值得一读

您需要为每个权限向模型的
Meta
子类添加代码:

class Meta:
    permissions = (
        ('edit_this_model', 'Edit this model'),
    )
如果您使用的是south,则可能需要在更新模型后运行
manage.py syncdb--all

要测试用户是否经过身份验证,请使用以下命令:

user.has_perm('your_app_name. edit_this_model')

试试Django Guradian。您可以使用它为用户/组分配对象级权限。

Site
这里不是Django contrib.Site对象,而是允许用户访问的属性,对吗?