1. 程式人生 > 實用技巧 >小談DRF之許可權相關

小談DRF之許可權相關

2. 許可權

先丟擲一個問題:不同的檢視不同的許可權可以訪問。比如:訂單相關檢視只允許SVIP才能訪問。

2.1 許可權的簡單實現(Django版本)

class OrderView(APIView):
    """訂單相關(只有SVIP可以訪問)"""

    authentication_classes = [Authentication, ]

    def get(self, request, *args, **kwargs):
        # print(request.user) # ---> UserInfo object
        # print(request.auth) # ---> UserToken object
        if request.user.user_type != 3:
            return HttpResponse('無權訪問')
        ret = {'code': 10000, 'msg': None, 'data': None}
        try:
            ret['data'] = ORDER_DICT
        except Exception as e:
            pass
        return JsonResponse(ret)

當用普通賬號的token測試後的結果為:

當用SVIP賬號的token測試後的結果為:

2.2 許可權的簡單使用(restframwork版本)

還是上面的簡單問題,現在用restframework的許可權相關功能實現:

class MyPermission(object):
    def has_permission(self, request, view):
        if request.user.user_type != 3:
            return False
        return True

from django.http import HttpResponse

class OrderView(APIView):
    """訂單相關(只有SVIP可以訪問)"""

    authentication_classes = [Authentication, ]
    permission_classes = [MyPermission, ]

    def get(self, request, *args, **kwargs):
        # print(request.user) # ---> UserInfo object
        # print(request.auth) # ---> UserToken object
        ret = {'code': 10000, 'msg': None, 'data': None}
        try:
            ret['data'] = ORDER_DICT
        except Exception as e:
            pass
        return JsonResponse(ret)

當用普通賬號的token測試後的結果為:

當用SVIP賬號的token測試後的結果為:

2.3 許可權原始碼流程分析

1 前面的原始碼分析和認證相關的一樣,只是在initial()方法中,涉及到了許可權的原始碼:

2 點開check_permissions()方法,檢視其原始碼:

2.1.1 點開get_permissions()方法,檢視其原始碼:

2.1.2 發現許可權的原始碼和認證的原始碼幾乎一樣,而且點開permission_classes的原始碼發現許可權的全域性設定和認證的全域性設定也是一樣的:

2.2.1 如果許可權認證失敗,走到了permission_denied()方法,檢視其原始碼,就是丟擲異常:

2.4 許可權的配置檔案

由上面的2.1.2發現,許可權的全域性配置或者區域性配置與認證的全域性配置或區域性配置是一樣的。

2.5 許可權的內建類

或者叫 rest framework基於內建類實現的許可權控制

​ 點選from restframework.permissons import BasePermission中的BasePermission我們可以看出也是和認證的內建類幾乎一樣,所以以後我們在寫自定義的許可權類時應該繼承於BasePermission;還有就是無論是認證還是許可權,我們幾乎用不到內建類,如果專案有需求都是要自己按需求寫的,所以瞭解即可。

再次點開BasePermission類,檢視其原始碼: