rest_framework之权限认证

作用

  对携带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()方法

至此,完成权限认证流程!

猜你喜欢

转载自www.cnblogs.com/liuyinzhou/p/9418417.html