Django REST框架和vanilla Django的基于角色的权限。
rest-framework-roles的Python项目详细描述
REST框架角色
Django和Django REST框架(函数或类)的基于角色的权限。在
- 将权限与视图和模型分离。在
- 简单的声明性配置(仍然允许复杂的场景)。在
- 视图重定向可以开箱即用。在
- 逐步与现有项目整合。在
安装
安装
pip install rest-framework-roles
在设置.py在
^{pr2}$使用
首先需要定义一些角色。下面我们使用的是现成的Django。在
在角色.py在
fromrest_framework_roles.rolesimportis_user,is_anon,is_adminROLES={'admin':is_admin,'user':is_user,'anon':is_anon,}
is_admin
、is_user
和{request
和{
我们现在需要定义何时应该为匹配的角色授予权限。在
在视图.py在
fromrest_framework.viewsetsimportModelViewSetfromrest_framework_roles.grantingimportis_selfclassUserViewSet(ModelViewSet):serializer_class=UserSerializerqueryset=User.objects.all()view_permissions={'retrieve':{'user':is_self,'admin':True},'create':{'anon':True},'list':{'admin':True},}@allowed('admin','user')@action(detail=False,methods=['get'])defme(self,request):self.kwargs['pk']=request.user.pkreturnself.retrieve(request)
在本例中,只有匿名用户才能创建新的用户帐户。管理员可以检索任何用户的帐户并列出用户。用户只能检索自己的信息。在
您可以使用^{str 1}中的任何一个允许$@,@不允许或view\u permissions指定权限。在
工作原理
库在内部使用权限表,但在较高的级别上,行为概述如下
- 按成本顺序检查第一个角色(由
@role_checker
设置) - 进一步检查匹配的角色以查看是否授予了权限。在
- 真实的布尔值和函数将授予权限。在
- 在集合的情况下(例如
@anyof
),按顺序计算授权检查程序。如果是真实的,允许。在 - 如果没有真实的结果,我们回退到框架权限。For REST框架
那就是
permission_classes
。在
注意,在下面的片段中,admin是一个用户,因此他将匹配两个角色。但是第一条规则 不允许,而第二个会。在
view_permissions = {
'retrieve': {'user': is_self, 'admin': True},
}
对于更多复杂的场景您可以指定在确定是否应授予权限时要检查的多个函数。在
from rest_framework_roles.granting import allof
def not_updating_email(request, view):
return 'email' not in request.data
class UserViewSet(ModelViewSet):
view_permissions = {
'update': {
'user': allof(is_self, not_updating_email),
'admin': True,
},
}
..
在这种情况下,用户只能更新他们的信息,只要他们不更新他们的电子邮件。在
角色检查顺序
按成本的顺序检查角色。在
fromrest_framework_roles.decoratorsimportrole_checker@role_checker(cost=0)defis_freebie_user(request,view):returnrequest.user.is_authenticatedandrequest.user.plan=='freebie'@role_checker(cost=0)defis_payed_user(request,view):returnrequest.user.is_authenticatedandnotrequest.user.plan@role_checker(cost=50)defis_creator(request,view):obj=view.get_object()ifhasattr(obj,'creator'):returnrequest.user==obj.creatorreturnFalse
在本例中,首先检查成本为0的角色,最后检查creator角色。在
Note this is similar to Django REST's
check_permissions
andcheck_object_permissions
but with much more room for refinement since you can have arbitrary number of costs.
- 项目
标签: