0

我正在使用django-guardian在我的 sweetpie api 中实现对象级权限,我希望能够在私有和公共之间切换资源权限的实例。

例如,我有一个Event资源。当 aUser创建一个Event时,将Event.creator设置为User实例。我在 上使用 aapost_save信号为创建它Event的人授予对象级权限User- 使其对创建者私有。

我希望User能够切换权限级别Event以允许所有用户能够访问它 - 也就是将事件从私有更改为公共(然后再返回)。

处理这个问题的最佳方法是什么?如果可能的话,我想坚持监护人,但我没有结婚。以下是一些有助于说明的代码片段:

模型.py

class UserProfile(models.Model):    
    user = models.OneToOneField(User, primary_key=True)
    events = models.ManyToManyField('myapp.Event', through="myapp.EventMembership", null=True, blank=True)

class Event(models.Model):
    name = models.CharField(max_length=64)
    creator = models.ForeignKey('myapp.UserProfile', related_name="creator")

资源.py

class EventResource(ModelResource):
    class Meta:
        queryset = Event.objects.all()
        resource_name = 'events'
        authentication = ApiKeyAuthentication()
        authorization = GuardianAuthorization(
            create_permission_code  = "myapp.add_event",
            view_permission_code    = "myapp.view_event",
            update_permission_code  = "myapp.change_event",
            delete_permission_code  = "myapp.delete_event"
        )
        always_return_data = True

    creator = fields.ForeignKey('myapp.UserProfile', 'creator', full=True)

    def hydrate(self, bundle, **kwargs):
        bundle.obj.creator = UserProfile.objects.get(user_id=bundle.request.user)
        return bundle

信号.py

@receiver(post_save, sender=User)
def allow_user_to_create_events(sender, instance, **kwargs):
    if not instance:
        return None

    if kwargs.get('created'):
        ApiKey.objects.create(user=instance)

    # give newly created user permissions to create events
    add_permission(instance, "myapp.add_event", Event)

@receiver(post_save, sender=Event)
def allow_user_to_edit_events(sender, instance, *args, **kwargs):
    if not instance or not isinstance(instance, Event):
        return None

    # assign_perm is a guardian shortcut
    assign_perm("myapp.view_event", instance.creator.user, instance)
    assign_perm("myapp.edit_event", instance.creator.user, instance)
    assign_perm("myapp.delete_event", instance.creator.user, instance)

感谢您的时间和帮助!

注意:我在我的美味派资源中使用了监护人授权。但是,我认为我的问题更像是一个监护人的问题,而不是与美味派一起使用。

4

1 回答 1

0

我不知道如何guaridan-authorization运作。但是在您的授权类中,True如果对象已设置为公共,则您始终可以进行查找并返回。

于 2015-03-06T01:08:52.953 回答