Django REST框架的灵活权限

drf-guard的Python项目详细描述


drf防护装置

为Django REST Framework(DRF)创建灵活且易于使用的访问规则。同时使用基于类的DRF权限、Django权限和Django组。这个库允许您以非常简单的方式构建复杂的访问规则,它允许您使用逻辑运算符组合权限和组。在

您是否曾经拥有多个权限或组,并且希望能够对您的端点执行以下操作?。在

# Check if user has certain permissions with `and`, `or` & `not` operatorspermissions:(IsAdminOr(IsObjectOwnerAndIsAllowedToEdit))

或者

^{pr2}$

你并不孤单,这个库允许你对每个端点使用AndOr&;Not运算符来实现这一点,不管你使用的是基于类的DRF权限、Django权限还是Django grops,它都可以处理所有这些问题。在

要求

  • Python>;=3.5
  • Django>;=1.11
  • Django REST框架>;=3.5

安装

pipinstalldrf-guard

入门

使用drf-guard非常简单,下面是一个例子

# views.py# Import operators & permissions from drf_guardfromdrf_guard.operatorsimportAnd,Or,Notfromdrf_guard.permissionsimportHasRequiredGroups,HasRequiredPermissionsclassUserViewSet(viewsets.ModelViewSet):queryset=User.objects.all()serializer_class=UserSerializer# Use drf_guard permissions herepermission_classes=(HasRequiredGroups,HasRequiredPermissions)# Now define access rules for your API endpoint with groups and permissions as you wishaccess_rules={'GET':{'list':{# To access this the user must belongs to admin or client group'groups':['admin',Or,'client'],'permissions':[IsAuthenticated]# Also the user must be authenticated},'retrieve':{'groups':[Not,'admin'],# The user must not be in admin group'permissions':[IsAuthenticated,And,IsAllowedUser]# Must be authenticated and allowed},},'POST':{'groups':[],# Don't allow at all(This evaluates to False always)'permissions':[]# Don't allow at all(This evaluates to False always)},'PUT':{'groups':'__any__',# Belongs to any group or none'permissions':'__any__'# Has any permission or none},'PATCH':{'groups':['client',And,Not,'admin'],# User belongs to client and not admin group'permissions':[IsAuthenticated,IsAllowedUser]# This is = [IsAuthenticated, And, IsAllowedUser]},'DELETE':{'groups':['client',Or,[Not,'client',And,'admin']],# You can basically do any combination'permissions':[IsAuthenticated]}}

这里重要的是了解组和权限中的内容

  • Groups使用组名和Django group对象,因此您可以使用这些运算符,但这两个运算符可以随意使用,甚至可以将这两种类型混合在一起,例如
'groups':[Group.objects.get(name='admin'),Or,'client']
  • Permissions接受DRF权限(基于类)、Django权限对象和Django权限名(代码名),因此您可以随意使用这些运算符,甚至可以同时使用这三种类型,例如
'permissions':[IsAuthenticated,And,Permissions.objects.get('view_user'),Or,'change_user']

注:

  • AndOr&;Not分别是andor&;not的等价运算符
  • andor&;not运算符AndOr&;Not没有优先级,如果您想要优先级,请使用list或tuple来生成一个,即[IsAuthenticated, And, [IsAdmin, Or, IsClient]]
  • 组/权限上的'__any__'表示任何组/权限或无
  • GET list代表GET: /users/路由中的权限和组
  • GET retrieve代表GET: /users/{id}/路由中的组和权限
  • 帖子代表POST: /users/路由中的组和权限
  • PUT表示PUT: /users/{id}/路由中的组和权限
  • 修补程序代表PATCH: /users/{id}/路由中的组和权限
  • DELETE表示DELETE: /users/{id}/路由中的组和权限

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

推荐PyPI第三方库


热门话题
java如何制作更好的自定义对话框?   锁定机制锁定UI线程的片段中的java Update ListView   heroku上的java调试嵌入式tomcat   java在使用键时未从映射返回特定数组   使用Blowfish生成secretKey时出现java问题   Appium\MAC OS\Android\Java组织。openqa。硒。SessionNotCreatedException   java在spring boot中解析json响应的最佳方法   java我怎样才能一行一行地看到每一行?   将Java连接到PostgreSQL时强制TZ?   java十六进制到二进制再到字符串   Spark steaming从Kafka中读取并在Java中应用Spark SQL聚合   java使用Cassandra中使用hector客户端的组合键的第一个组件获取行   java类型不匹配:无法从列表<类名>转换为游标:安卓错误   TopCoreDocCollector类型中的java方法create(int,int)不能用于参数(int,boolean)