作用
对携带token的用户进行权限认证。
实现原理:
用户对于某一个视图的访问需要携带token,在登录认证通过之后,通过携带的token进行权限认证。
基本使用
创建权限类
1 from rest_framework.permissions import BasePermission 2 3 4 class Mypermission(BasePermission): 5 message = "您没有该权限" 6 7 def has_permission(self, request, view): 8 """ 9 对用户权限进行认证 10 :param request: 11 :param view: 当前视图类对象 12 :return: 13 True:权限认证通过 14 False:权限认证不通过 15 """ 16 if request.user.user_type not in [1, 2]: 17 return False 18 return True 19 20 # 视图继承 GenericAPIView,并执行get_object方法时被调用 21 def has_object_permission(self, request, view, obj): 22 """ 23 对单个对象进行操作的时候执行此函数 24 :param request: 25 :param view: 26 :param obj: 27 :return: 28 """ 29 print("view", view, "obj", obj) 30 return True
返回值类型:
True:此次权限认证通过
False:此次权限不通过,自动抛出异常。
视图部分
1 from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView 2 from rest_framework.serializers import ModelSerializer 3 4 5 # 序列化类 6 class Userserializers(ModelSerializer): 7 class Meta: 8 model = models.UserInfo 9 fields = "__all__" 10 11 12 # 订单类 13 class Orders(ListCreateAPIView): 14 # 当某个视图不需要做全局的认证,则使authentication_classes 的列表为空即可 15 permission_classes = [Mypermission] 16 queryset = models.UserInfo.objects.all() 17 serializer_class = Userserializers 18 19 def get(self, request,*args, **kwargs): 20 # 获取到元组的第一个数据:request.user 21 # 获取到元组的第二个数据:request.auth 22 return self.list(request, *args, **kwargs) 23 24 def post(self,request, *args, **kwargs): 25 return self.create(request, *args, **kwargs) 26 27 28 # 订单详情 29 class Ordersdetail(RetrieveUpdateDestroyAPIView): 30 # 当某个视图不需要做全局的认证,则使authentication_classes 的列表为空即可 31 permission_classes = [Mypermission] 32 queryset = models.UserInfo.objects.all() 33 serializer_class = Userserializers 34 35 def get(self, request, *args, **kwargs): 36 return self.retrieve(request, *args, **kwargs) 37 38 def put(self, request, *args, **kwargs): 39 return self.update(request, *args, **kwargs) 40 41 def patch(self, request, *args, **kwargs): 42 return self.partial_update(request, *args, **kwargs) 43 44 def delete(self, request, *args, **kwargs): 45 return self.destroy(request, *args, **kwargs)
路由部分
1 from django.conf.urls import url 2 from . import views 3 urlpatterns = [ 4 # 路由的含义是:views.Orders.as_view() 得到view的内存地址,此时并不会执行该方法,只有当匹配成功之后会为该方法加()从而执行该函数 5 url(r'^orders/$',views.Orders.as_view()), 6 url(r'^orders/(?P<pk>\d+)/$',views.Ordersdetail.as_view()), 7 url(r'^login/$',views.Login.as_view()), 8 ]
全局配置
REST_FRAMEWORK = { # 指定全局认证类 "DEFAULT_AUTHENTICATION_CLASSES":["app01.utils.authclasses.Myauth",], "UNAUTHENTICATED_USER":None,# 指定匿名用户:request.user = None "UNAUTHENTICATED_TOKEN":None,# 指定未认证用户:request.auth = None 'DEFAULT_PERMISSION_CLASSES': ['app01.utils.premissionclasses.Mypermission'], "DEFAULT_THROTTLE_CLASSES": ["app01.utils.throttle.VisitThrottle", ], "DEFAULT_THROTTLE_RATES": { "xxx": "5/m",# 根据节流控制类中的配置 } }
源码执行流程
1.ListCreateAPIView
2.GenericAPIView
3.APIView
4.进行rest_framework的认证操作
5.权限认证
6.执行权限类实例的has_permission()方法
PS:
对单个对象实例进行操作的时候的执行流程为:
1.RetrieveUpdateDestroyAPIView
2.GenericAPIView
3.执行GenericAPIView下的get_obj()方法
至此,完成权限认证流程!