Django REST framwork的权限验证实例
在这里插入代码片#DjangoRESTframwork的权限验证
一、用户是否登录
(1)判断用户是否登录;
permission_classes=(IsAuthenticated,)
注意:permission_classes设置的是:验证的是用户是否登录、用户是否可以操作该数据等的权限;
权限组合方式,目前支持:与&(and)或|(or)非~(not)
例如:permission_classes=(SecAdminPermission|AudAdminPermission,)
注意:使用元组(SecAdminPermission|AudAdminPermission,)或列表[SecAdminPermission|AudAdminPermission]都可以。
(2)设置用户认证方式;
authentication_classes=(JSONWebTokenAuthentication,SessionAuthentication)
注意:authentication_classes设置的是:用户可以通过哪种方式登录系统,例如:JWT或传统的用户名+密码方式登录。
具体代码如下:
fromrest_framework.permissionsimportIsAuthenticated#判断用户是否登录 fromrest_framework_jwt.authenticationimportJSONWebTokenAuthentication#jwt用户认证 classUserFavViewset(mixins.CreateModelMixin,mixins.ListModelMixin,mixins.RetrieveModelMixin, mixins.DestroyModelMixin,viewsets.GenericViewSet): """ list: 获取用户收藏列表 retrieve: 判断某个商品是否已经收藏 create: 收藏商品 delete: 取消收藏 """ #权限判断:IsAuthenticated表示是否已经登录,IsOwnerOrReadOnly表示数据是不是属于当前登录用户 permission_classes=(IsAuthenticated,IsOwnerOrReadOnly) #用户认证:方式一:JSONWebTokenAuthentication;方式二:SessionAuthentication authentication_classes=(JSONWebTokenAuthentication,SessionAuthentication) #定义通过哪个参数来定位实例 lookup_field="goods_id"#在详细页面时,搜索goods_id来确认该商品有没有被收藏,是在当前用户下进行搜索的 defget_queryset(self): """获取当前登录用户的收藏信息""" returnUserFav.objects.filter(user=self.request.user) #方法一:修改商品收藏数 #defperform_create(self,serializer): #"""修改商品收藏数""" #instance=serializer.save() #goods=instance.goods #goods.fav_num+=1 #goods.save() #动态设置序列化类 defget_serializer_class(self): ifself.action=="list": returnUserFavDetailSerializer elifself.action=="create": returnUserFavSerializer returnUserFavSerializer
二、用户是否对该数据有操作权限;
(1)自定义权限验证
前提:待验证对象有user字段;
fromrest_frameworkimportpermissions #权限判断:数据是不是属于当前登录用户 classIsOwnerOrReadOnly(permissions.BasePermission): """ Object-levelpermissiontoonlyallowownersofanobjecttoeditit. Assumesthemodelinstancehasan`owner`attribute. """ defhas_object_permission(self,request,view,obj): #1只读 #Readpermissionsareallowedtoanyrequest, #sowe'llalwaysallowGET,HEADorOPTIONSrequests. ifrequest.methodinpermissions.SAFE_METHODS:#是不是安全的访问方法 returnTrue #2写权限 #Instancemusthaveanattributenamed`owner`. #return(obj.publisherifobj.publisherelseself.fans)==request.user returnobj.user==request.user#判断当前数据是不是登录用户的数据
(2)在接口中,添加数据权限验证;
classUserFavViewset(mixins.CreateModelMixin,mixins.ListModelMixin,mixins.RetrieveModelMixin, mixins.DestroyModelMixin,viewsets.GenericViewSet): """ list: 获取用户收藏列表 retrieve: 判断某个商品是否已经收藏 create: 收藏商品 delete: 取消收藏 """ #权限判断:IsAuthenticated表示是否已经登录,IsOwnerOrReadOnly表示数据是不是属于当前登录用户 permission_classes=(IsAuthenticated,IsOwnerOrReadOnly) #用户认证:方式一:JSONWebTokenAuthentication;方式二:SessionAuthentication authentication_classes=(JSONWebTokenAuthentication,SessionAuthentication) #设置 lookup_field="goods_id"#在详细页面时,搜索goods_id来确认该商品有没有被收藏,是在当前用户下进行搜索的 defget_queryset(self): """获取当前登录用户的收藏信息""" returnUserFav.objects.filter(user=self.request.user)
补充知识:djangorestframeworkapi授权与认证
djangorestf官方文档授权与认证教程
permissions.py
fromrest_frameworkimportpermissions classIsOwnerOrReadOnly(permissions.BasePermission): ''' 常规的授权是只有拥有者才能编辑它 ''' defhas_object_permission(self,request,view,obj): #读权限向所有请求开放 #所以我们总是允许get,headoroptionsrequests. ifrequest.methodinpermissions.SAFE_METHODS: returnTrue #写权限只给拥有者 returnobj.owner==request.user
view.py
'''基于泛型类的视图''' fromsnippets.modelsimportSnippet fromsnippets.serializersimportSnippetSerializer,UserSerializer fromrest_frameworkimportgenerics fromsnippets.permissionsimportIsOwnerOrReadOnly fromdjango.contrib.auth.modelsimportUser classUserList(generics.ListAPIView): ''' User表的列表api视图查增操作 ''' queryset=User.objects.all() serializer_class=UserSerializer classUserDetail(generics.RetrieveDestroyAPIView): ''' User表的详情api视图查改删操作 ''' queryset=User.objects.all() serializer_class=UserSerializer classSnippetList(generics.ListCreateAPIView): permission_classes=[permissions.IsAuthenticatedOrReadOnly] queryset=Snippet.objects.all() serializer_class=SnippetSerializer defperform_create(self,serializer): serializer.save(owner=self.request.user) classSnippetDetail(generics.RetrieveDestroyAPIView): #detail所有人都能读,但是只有拥有者可以更改 #permissions.IsAuthenticatedOrReadOnly表示没有认证的人有读的权限,认证的人有所有权限 #IsOwnerOrReadOnly通过了前面的授权之后,还要通过这个授权 #当所有的授权都通过的时候所有的对象实例都返回true表示授权通过 permission_classes=[permissions.IsAuthenticatedOrReadOnly,IsOwnerOrReadOnly] queryset=Snippet.objects.all() serializer_class=SnippetSerializer
总结:通过传递permission_classes类变量传递授权类,
1、请求要进行某个操作的时候->
2、传递参数将授权类列表中的多个授权类实例化得到实例化对象->
3、调用所有授权实例对象的has_、permission以及has_object_permission方法->
4、所有的返回结果都为true->
5、该操作的授权才通过,数据操作向下继续进行。
以上这篇DjangoRESTframwork的权限验证实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。