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}$你并不孤单,这个库允许你对每个端点使用And
,Or
&;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']
注:
And
,Or
&;Not
分别是and
,or
&;not
的等价运算符- 与
and
,or
&;not
运算符And
,Or
&;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}/
路由中的组和权限
- 项目
标签: