Django REST框架和vanilla Django的基于角色的权限。

rest-framework-roles的Python项目详细描述


REST框架角色

rest-framework-roles

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_adminis_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指定权限。在

工作原理

库在内部使用权限表,但在较高的级别上,行为概述如下

  1. 按成本顺序检查第一个角色(由@role_checker设置)
  2. 进一步检查匹配的角色以查看是否授予了权限。在
  • 真实的布尔值和函数将授予权限。在
  • 在集合的情况下(例如@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 and check_object_permissions but with much more room for refinement since you can have arbitrary number of costs.

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java连接在一个屏幕上成功下载,在第二个屏幕上用几乎相同的代码获得错误   java调用super。超级的方法,跳过超级。方法   使用Web服务连接到sharepoint 2013的Java应用程序   java我无法正确呈现editText   httpurlconnection如何在java中检查url连接状态   java Spring Security可以为同一用户接受多个密码吗?   java如何在PreparedStatement中使用自动生成的@Id?   java每个数组表示一个位模式   java我不确定如何记录鼠标在某个区域被点击的次数   spring如何解决:java。lang.NoSuchMethodError:javax。坚持不懈实体管理器。createStoredProcedureQuery(Ljava/lang/String;)   java如何为blackberry中listfield项内的不同字段触发事件   安卓使用Proguard混淆java代码   java在grails 2中与多个数据源有一个和一个域关联。十、   java在尝试在单击按钮时返回combobox值时一直出错   java我可以在setter中使用@Resource注释而不是字段吗?   java Eclipse调试步进不工作   java比较相同对象的两个表并选择不同的表