2013-03-18 37 views
4

我正在使用django-tastypie编写API。我有两个定制permisions问题,我希望django-guardian可以修复。限制对仅拥有内容的访问django

我有两个用户组临床医师和患者。临床医生应该能够访问属于他们患者的对象,并且患者应该只能够访问由他们自己创建的对象。

我的代码如下:

class UserResource(ModelResource): 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'auth/user' 
     excludes = ['email', 'password', 'is_superuser'] 


class BlogPostResource(ModelResource): 
    author = fields.ToOneField(UserResource, 'author', full=True) 

    class Meta: 
     queryset = BlogPost.objects.all() 
     resource_name = 'posts' 
     allowed_methods = ["get", "post"] 
     # Add it here. 
     authentication = BasicAuthentication() 
     authorization = DjangoAuthorization() 
     filtering = { 
      'author': ALL_WITH_RELATIONS, 
     } 

我怎样才能使用权限来限制对这个BlogPostResource访问?

class CustomAuthorization(Authorization): 
    def apply_limits(self, request, object_list):  
     ... 
     clin_group = Group.objects.get(name='YOUR GROUP') 
     if request and hasattr(request, 'user'): 
      if clin_group in request.user.groups.all(): 
       object_list = object_list.filter(user__in=request.user.patients.all()) # or however you stop clinician>patient relation 
      else: 
       object_list = object_list.filter(user=request.user) 
     return object_list 

回答

2

我根据我的离开answer的最终解决方案,从@JamesO

+0

长期可扩展性,请参阅http://stackoverflow.com/a/16261711/454615 – airtonix 2013-04-28 10:04:08

4

你可以用自定义Authorization类实现这一点,例如像。他的回答的问题是它是在改写Authorization类之前写入老版本的django-tastypie的。这里是我的代码供将来参考:

from tastypie.authorization import Authorization 
from django.contrib.auth.models import Group 
from extendedusers.models import ExtendedUser 


class CustomAuthorization(Authorization): 
    def read_list(self, object_list, bundle): 
     clinician_group = Group.objects.get(name='clinician') 
     if bundle.request and hasattr(bundle.request, 'user'): 
      if clinician_group in bundle.request.user.groups.all(): 
       patients = ExtendedUser.objects.filter(clinician_id=bundle.request.user.id) 
       object_list = object_list.filter(author__id__in=patients) 
      else: 
       object_list = object_list.filter(author=bundle.request.user) 
      return object_list 
     else: 
      return object_list.none() 
+0

谢谢,这是我曾考虑的方法。唯一的是(我忘了在我的问题中提到)我们也有一个正常的django web界面,需要完全相同的权限创建的内容,我不想分割访问策略代码... – Prydie 2013-03-18 14:09:08

+0

@Prydie - 啊,我明白了。您可以创建经理,在其中设置访问控制,然后在您的核心应用/管理员和您的tastypie应用中调用经理?将代码保存在一个地方。 – JamesO 2013-03-18 14:58:39

+0

我很尴尬地说我不知道​​经理是什么... – Prydie 2013-03-18 15:05:21