天道酬勤,学无止境

Object level cascading permission in Django

Projects such as Django-guardian and django-permissions enables you to have object level permissions. However, if two objects are related to each other by a parent-child relationship, is there any way for the child object to inherit permission from the parent object unless otherwise specified? For instance, a subfolder should inherit permission from parent folder unless a user explicitly assigns a different permission for the subfolder.

What's the best way to accomplish this using Django, in particular, the Django-guardian module?

评论

When you check if a user has permissions on an object, and doesn't, then you can check if it has permission on its parent.

You might even want to make your own function, for example:

def your_has_perm(user, perm, obj):
    has = user.has_perm(perm, obj)

    if not has and hasattr(obj, 'parent'):
        return your_has_perm(user, perm, obj.parent)

    return has

This should traverse parents until it finds a permission for a parent or return False.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Field level validation with request.user in Django rest framework
    I am setting up a Django REST application where peopple can review restaurants. So far I have those models: class RestaurantId(models.Model): maps_id = models.CharField(max_length=140, unique=True) adress = models.CharField(max_length=240) name = models.CharField(max_length=140) class RestaurantReview(models.Model): review_author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) restaurant_id = models.ForeignKey(RestaurantId, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class StarterPics
  • 在 Django rest 框架中使用 request.user 进行字段级验证(Field level validation with request.user in Django rest framework)
    问题 我正在设置一个 Django REST 应用程序,人们可以在其中查看餐厅。 到目前为止,我有这些模型: class RestaurantId(models.Model): maps_id = models.CharField(max_length=140, unique=True) adress = models.CharField(max_length=240) name = models.CharField(max_length=140) class RestaurantReview(models.Model): review_author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) restaurant_id = models.ForeignKey(RestaurantId, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class StarterPics(models.Model): restaurant_review_id = models
  • Django DRF permissions on create related objects
    I struggle to enforce security on objects creation on Django REST framework. Basically, I can enforce security at the object level with 'has_object_permission' : the logged in user must be the owner of the object to manipulate it. Actually, as stated in the doc, I narrow objects retrieval in the queryset so, i got 404 instead of 403. That I think is not a problem (even better, as it hides the objects existences) But I do not succeed at disallowing another user to create a related object.... I use ModelSerializer and ModelViewSet. here are some naive snippets : models.py : class Daddy(models
  • 创建相关对象的 Django DRF 权限(Django DRF permissions on create related objects)
    问题 我努力在 Django REST 框架上强制执行对象创建的安全性。 基本上,我可以使用 'has_object_permission' 在对象级别强制实施安全性:登录用户必须是对象的所有者才能操作它。 实际上,如文档中所述,我缩小了查询集中的对象检索范围,因此我得到了 404 而不是 403。我认为这不是问题(更好,因为它隐藏了对象的存在) 但是我没有成功禁止另一个用户创建相关对象.... 我使用 ModelSerializer 和 ModelViewSet。 这里有一些幼稚的片段: 模型.py: class Daddy(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) name = models.CharField(max_length=20) owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) class Kiddy(models.Model): title = models.CharField(max_length=12) daddy = models.foreignKey(Daddy, on_delete=models.CASCADE)
  • ViewFlow 和 django-guardian(ViewFlow and django-guardian)
    问题 我想利用django-guardian的对象权限并将特定用户的特定权限授予一个或多个 Django 用户。 我尝试向我的 Process 类添加一些权限,如下所示: class TestProcess(Process): title = models.CharField(max_length=64) something = models.ForeignKey(ForInheritage, null=True, on_delete=models.CASCADE) no_approval = models.BooleanField(default=False) approved = models.BooleanField(default=False) def something_is_approved(self): try: return self.something.approved except: return None class Meta: permissions = ( ('view_process', 'View Process'), ) 不幸的是,这会导致viewflow在启动runserver后立即抛出错误: File "/home/me/.virtualenvs/viewflow3/lib/python3.4/site-packages/viewflow
  • 在 Django Admin 中仅有权修改模型的一个字段的用户(User with permission to modify only one field of the model in the Django Admin)
    问题 我有一个名为ExpertUser的用户,他应该只能修改 Django Admin 中用户的被调用模型(金钱)的属性。 我曾尝试使用Meta在模型中添加权限,但是当使用该权限输入时,我无法修改任何内容,因为我无权访问任何用户。 我的模型是这样的: class Client(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) money = models.FloatField(default=1000) def __str__(self): return self.user.username class Meta: permissions = (("can_view_money", "Can view money"),) 回答1 看看 Django Guardian。 这为在各个级别分配权限提供了更大的灵活性。 Django 只允许您在对象级别设置权限,因此在您的情况下,您只能设置创建/编辑/删除客户端对象的权限。 http://django-guardian.readthedocs.io/en/v1.4.8/index.html 如果这还不够,还有其他一些具有所需功能的软件包: https://djangopackages.org/grids/g/perms/
  • 基于django中的一些条件创建一个对象(creating an object based on some conditions in django)
    问题 我有一个名为Showcase的模型,用户用它来展示项目。 我正在尝试实现一个案例,其中展示中Administrators字段中的任何管理员都可以通过Collaborator模型添加协作者。 当我在下面运行我的代码时,我得到 IntegrityError at /api/showcase/the-gods-must-be-crazy-zz2fox/collaborator/create/ NOT NULL constraint failed: showcase_collaborator.user_id 。 模型.py class Showcase(models.Model): title = models.CharField(max_length=50) description = models.TextField(null=True) skill_type = models.ForeignKey(Skill, on_delete=models.CASCADE) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, related_name="Showcases") content = models.TextField(null=True) created_on =
  • creating an object based on some conditions in django
    I have a model called Showcase that users use to showcase projects. I am trying to implement a case where any administrator in the Administrators field in the showcase can add collaborators through the Collaborator model. When I run my code below, I get IntegrityError at /api/showcase/the-gods-must-be-crazy-zz2fox/collaborator/create/ NOT NULL constraint failed: showcase_collaborator.user_id. models.py class Showcase(models.Model): title = models.CharField(max_length=50) description = models.TextField(null=True) skill_type = models.ForeignKey(Skill, on_delete=models.CASCADE) user = models
  • Django模型层
    Django模型层是Django框架自定义的一套独特的ORM技术。 6.3.1 基本操作 使用Django模型开发的首要任务就是定义模型类及其属性。每个模型类都可以被映射未数据库中的一个数据表。而类属性被映射未数据字段,除此之外,数据库表的主键、外键、约束等也可通过类属性完成定义。 1. 模型类定义 模型定义的基本结构如下: from django.db import models class ModelName(models.Models): field1 = models.XXField(...) field2 = models.XXField(...) ... class Meta: db_table = ... other_metas = ... 解析如下: 所有Django模型继承自django.db.models.Model类。通过其中的类属性定义模型字段,模型字段必须是某种models.XXField类型。通过模型类中的Meta子类定义模型元数据,比如数据库表名、数据默认排序方式等。 Meta类的属性名有Django预定义,常用的Meta类属性汇总如下。 abstract:True of False,标识本类是否为抽象基类。app_label:定义本类所属的应用,比如app_label='myapp'。db_table:映射的数据表名,比如db_table=
  • Django 1.2 对象级权限 - 第三方解决方案?(Django 1.2 object level permissions - third party solutions?)
    问题 锁定。 此问题及其答案已锁定,因为该问题偏离主题但具有历史意义。 它目前不接受新的答案或互动。 由于 Django 1.2 final 快要出来了,我很好奇是否已经有项目使用新的对象级权限/行级权限系统。 Django-authority 是 Django 到 1.1 的一个可能的解决方案,已经有一段时间没有更新了,并且(还)没有使用新的权限系统。 在我看来,Django-Authority 处于昏迷状态。 有人知道即将到来的甚至可能完成的解决方案吗? 我非常感谢至少有一些可下载内容的活动项目的任何良好链接。 回答1 我在项目中使用 https://github.com/lukaszb/django-guardian 时它仍然是 0.2 版,它相当完整且没有错误。 是的,我确实必须编写我自己的“check_permission”视图装饰器,因为当时它还没有包含它 - 但至少从 1.0 版开始它就在那里。 作者也非常迅速地回应了我从 0.2 迁移的问题 - 总的来说我对它很满意,因此将它作为我项目骨架模板的一部分。 回答2 最后,我发现了非常好的东西:Florian Apolloner 在 djangoadvent 上写了一个 howto:http://djangoadvent.com/1.2/object-permissions/ 现在这就是我要使用的 :)
  • on_delete对Django模型有什么作用?(What does on_delete do on Django models?)
    问题 我对Django非常熟悉,但是最近我注意到on_delete=models.CASCADE存在on_delete=models.CASCADE选项。 我已经搜索了相同的文档,但是除了以下内容外,我什么也找不到: 在Django 1.9中进行了更改: 现在可以将on_delete用作第二个位置参数(以前通常仅将其作为关键字参数传递)。 在Django 2.0中,这是必填参数。 用法示例是: from django.db import models class Car(models.Model): manufacturer = models.ForeignKey( 'Manufacturer', on_delete=models.CASCADE, ) # ... class Manufacturer(models.Model): # ... pass on_delete是做什么的? (我猜想如果删除模型,应该执行的操作。) models.CASCADE什么作用? (文档中的任何提示) 还有其他可用的选项(如果我的猜测是正确的)? 有关此文档的位置在哪里? 回答1 这是删除引用对象时要采取的行为。 它不是特定于Django的。 这是一个SQL标准。 尽管Django在SQL之上有自己的实现。 (1) 发生此类事件时,可以采取七种可能的措施: CASCADE :删除引用的对象时
  • on_delete 对 Django 模型有什么作用?(What does on_delete do on Django models?)
    问题 我对 Django 非常熟悉,但我最近注意到on_delete=models.CASCADE有一个on_delete=models.CASCADE选项。 我已经搜索了相同的文档,但除了以下内容之外我什么也找不到: 在 Django 1.9 中更改: on_delete现在可以用作第二个位置参数(以前它通常只作为关键字参数传递)。 这将是 Django 2.0 中的必需参数。 一个使用案例是: from django.db import models class Car(models.Model): manufacturer = models.ForeignKey( 'Manufacturer', on_delete=models.CASCADE, ) # ... class Manufacturer(models.Model): # ... pass on_delete 有什么作用? (我猜如果删除模型要执行的操作。) models.CASCADE什么作用? (文档中的任何提示) 还有哪些其他选项可用(如果我的猜测是正确的)? 这方面的文档在哪里? 回答1 这是删除引用对象时要采用的行为。 它不是 Django 特有的; 这是一个 SQL 标准。 尽管 Django 在 SQL 之上有自己的实现。 (1) 发生此类事件时,可以采取七种可能的操作: CASCADE
  • 我正在编写一个客户权限类来为用户添加权限,以便为每个用户对电影进行一次评级(i am tring to write a customr permissions class to add permissions for the user to rate the movie once per user)
    问题 在这里,我尝试添加自定义权限 1. 用户可以对电影评分一次 2. 用户可以添加电影,其他人(创作者除外)可以对其进行评分。 我已经在permission.py 中编写了自定义权限类,但它仍然没有做我想要的但它出错了。可以请一些帮助 模型.py from django.contrib.auth.models import User from django.core.validators import MinValueValidator, MaxValueValidator class Movie(models.Model): title = models.CharField(max_length=128) director = models.CharField(max_length=128) added_by = models.ForeignKey(User, related_name="movie", on_delete=models.CASCADE, null=True) added_at = models.DateTimeField(auto_now_add=True) # rating=models.IntegerField() class Meta: db_table = "Movie" class Rating(models.Model): movie =
  • Django 中的行级权限(row level permissions in django)
    问题 有没有办法在 Django 中执行行级权限? 我以为没有,但只是在文档中注意到了这一点: 不仅可以按对象类型设置权限,还可以按特定对象实例设置权限。 通过使用 ModelAdmin 类提供的 has_add_permission()、has_change_permission() 和 has_delete_permission() 方法,可以为相同类型的不同对象实例自定义权限。 https://docs.djangoproject.com/en/dev/topics/auth/ 但我没有看到任何关于如何实际实现每个实例权限的文档 回答1 对于我正在构建的应用程序,我想通过一个简单的装饰器提供行级权限。 我可以这样做,因为条件只是 request.user 是否是模型对象的所有者。 以下似乎有效: from functools import wraps from django.core.exceptions import PermissionDenied, ObjectDoesNotExist def is_owner_permission_required(model, pk_name='pk'): def decorator(view_func): def wrap(request, *args, **kwargs): pk = kwargs.get(pk_name
  • DRF比Django的认证和权限高在哪里
    Django可以用LoginRequiredMixin和PermissionRequiredMixin给类视图添加认证和权限,DRF做了高级封装,提供了更简洁的实现方式。我们通过继续学习官网教程来进行了解。更新model首先修改Snippet模型,添加2个字段:owner,存储snippet创建者,highlighted,存储高亮HTML。同时重写save方法,在同步数据库的时候,使用pygments包把code格式化后存到highlighted字段。修改后的snippets/models.py完整代码如下:from django.db import models from pygments.lexers import get_all_lexers from pygments.styles import get_all_styles from pygments.lexers import get_lexer_by_name from pygments.formatters.html import HtmlFormatter from pygments import highlight LEXERS = [item for item in get_all_lexers() if item[1]] LANGUAGE_CHOICES = sorted([(item[1][0], item
  • Django自定义User模型以及用户系统(用户、权限、组)的使用
    Django自带强大的User系统,为我们提供用户认证、权限、组等一系列功能,可以快速建立一个完整的后台功能。 但User模型并不能满足我们的需求,例如自带的User表中没有手机号码,而且对于国人来说表中的first_name和last_name并没有什么卵用,对于实际生产中灵活的用户表来说重写User模型是非常有必要的。 扩展User模型 扩展User模型有许多的方法: 1、Proxy继承: 代理继承,此方法只能够继承User本身拥有的字段,并不能够添加和删改,不会影响表中原有的结构,但是可以定义一些方法来获取我们需要的数据: from django.contrib.auth.models import User class ProxyUser(User): class Meta: proxy = True # 定义代理模型 def get_data(self): return self.objects.filter("过滤条件") 2、一对一外键: 如果我们对User本身的字段和验证方法没有要求,只是想要增加额外字段,可以通过创建另外一张表去关联User表,从而添加额外字段,并且我们可以写一个接受保存模型的信号处理方法,只要User调用了save方法,那么关联表就会自动添加一条数据与User新添加的用户进行绑定: from django.db import models
  • ViewFlow and django-guardian
    I want to make use of django-guardian's object permissions and grant specific rights for specific users to one or more Django users. I have tried to add some permissions to my Process class like this: class TestProcess(Process): title = models.CharField(max_length=64) something = models.ForeignKey(ForInheritage, null=True, on_delete=models.CASCADE) no_approval = models.BooleanField(default=False) approved = models.BooleanField(default=False) def something_is_approved(self): try: return self.something.approved except: return None class Meta: permissions = ( ('view_process', 'View Process'), )
  • 在 django rest 框架中实现角色(Implement roles in django rest framework)
    问题 我正在构建一个应该具有以下类型用户的 API super_user - 创建/管理管理员 admin - 管理事件(模型)和事件参与者 participants - 参加活动,受管理员邀请参加活动 另外我想让每种类型的用户都有电话号码字段 我试过了 class SuperUser(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) phone_number = models.CharField(max_length=20) class Admin(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) phone_number = models.CharField(max_length=20) class Participant(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) phone_number = models.CharField(max_length=20) 但是直觉告诉我这是一种错误的处理方式。 有人可以帮忙吗。 回答1 一种可能的解决方案是: 只有一个带有角色字段的用户模型
  • Django:通过表从多到多的模板访问值(Django: template access value from many to many through table)
    问题 我有以下表格模型。 class Experience(models.Model): name = models.CharField(max_length=50) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) about = models.TextField() def __unicode__(self): return self.name class Level(models.Model): level = models.IntegerField() details = models.TextField() created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) started = models.IntegerField(default=0) completed = models.IntegerField(default=0) exp = models.ManyToManyField(Experience, through='ExperienceLinks') def __unicode__
  • 如果对象存在,Django过滤并显示在模板中(Django filter and display in template if object exists)
    问题 模型.py: class Level(models.Model): number = models.IntegerField() badge = models.ImageField() locked_badge = models.ImageField() timestamp= models.DateTimeField(auto_now_add=True,auto_now=False,blank=True, null=True) unlock = models.CharField(max_length=10,default="A") def __str__(self): return str(self.number) def get_absolute_url(self): return reverse('student:level-detail', kwargs={'pk': self.pk}) class ToDo(models.Model): level = models.ForeignKey(Level, on_delete=models.CASCADE) name = models.CharField(max_length=150) description = models.TextField() timestamp = models.DateTimeField