1. 程式人生 > >rest_framework 認證與許可權

rest_framework 認證與許可權

一  認證

1.1先寫個類(認證元件)

from app01 import models
from rest_framework import exceptions
from rest_framework.authentication import BaseAuthentication


# 用drf的認證,寫一個類,可以繼承BaseAuthentication,也可以不用
# class LoginAuth(BaseAuthentication):

class LoginAuth():
    # 函式名一定要叫authenticate,接收必須兩個引數,第二個引數是request物件
def authenticate(self, request): # 從request物件中取出token(也可以從其它地方取) token = request.query_params.get('token') # 去資料庫過濾,查詢 ret = models.UserToken.objects.filter(token=token) if ret: # 能查到,說明認證通過,返回空 # ret.user就是當前登入使用者物件,一旦retrun了,後面的認證類都不執行了
return ret.user,ret # 如果查不到,拋異常 raise exceptions.APIException('您認證失敗')

1.2views

def get_token(name):
    # 生成一個md5物件
    md5 = hashlib.md5()
    # 往裡新增值,必須是bytes格式
    # time.time()生成時間戳型別,轉成字串,再encode轉成bytes格式
    md5.update(str(time.time()).encode('utf-8'))
    md5.update(name.encode(
'utf-8')) return md5.hexdigest() # 登入 class Login(APIView): authentication_classes = [] def post(self, request, *args, **kwargs): response = {'status': 100, 'msg': '登入成功'} name = request.data.get('name') pwd = request.data.get('pwd') try: user = models.UserInfo.objects.get(name=name, pwd=pwd) # 校驗通過,登入成功,生成一個隨機字串(身份標識)token token = get_token(name) # 儲存到資料庫 # update_or_create更新或者建立 models.UserToken.objects.update_or_create(user=user, defaults={'token': token}) response['token'] = token except ObjectDoesNotExist as e: response['status'] = 101 response['msg'] = '使用者名稱或密碼錯誤' except Exception as e: response['status'] = 102 # response['msg']='未知錯誤' response['msg'] = str(e) return JsonResponse(response, safe=False) class Books(APIView): # 列表中,類名不能加括號 # authentication_classes = [LoginAuth, ] def get(self, request, *args, **kwargs): # 只要通過認證,就能取到當前登入使用者物件 print(request.user) response = {'status': 100, 'msg': '查詢成功'} ret = models.Book.objects.all() book_ser = MySerializer.BookSerializer(ret, many=True) response['data'] = book_ser.data return JsonResponse(response, safe=False)

1.3區域性配置,全域性配置,區域性禁用

1.3.1區域性配置

class Books(APIView):
    # 列表中,類名不能加括號
    # 區域性配置,就是在需要認證功能的檢視函式下加
    authentication_classes = [LoginAuth, ]
   

1.3.2全域性配置

# 在settings中配置   
REST_FRAMEWORK={
    'DEFAULT_AUTHENTICATION_CLASSES':['app01.MyAuth.LoginAuth',],   #認證
    'DEFAULT_PERMISSION_CLASSES':['app01.MyAuth.Permission',]   #許可權
}

1.3.3區域性禁用

class Books(APIView):
    # 列表中,類名不能加括號
    # 區域性禁用,就是在需要認證功能的檢視函式下的authentication_classes的列表置空
    authentication_classes = [ ]

1.4認證的順序

認證類使用順序:先用檢視類中的驗證類,再用settings裡配置的驗證類,最後用預設的驗證類

二  許可權

2.1寫一個類(許可權元件)

class UserPermission(BasePermission):
    # message是出錯顯示的中文
    message='您沒有許可權檢視'
    def has_permission(self, request, view):
        user_type = request.user.user_type
        # 取出使用者型別對應的文字
        # 固定用法:get_欄位名字_display()
        user_type_name = request.user.get_user_type_display()
        print(user_type_name)
        if user_type == 2:
            return True
        else:
            return False

2.2許可權的簡單使用(views)

# 需求,只能超級使用者來檢視作者詳情,其他人不能看
from app01.MyAuth import UserPermission
class Authors(APIView):
    # permission_classes=[UserPermission,]
    # 區域性禁用:
    permission_classes = []
    def get(self, request, *args, **kwargs):


        response = {'status': 100, 'msg': '查詢成功'}
        ret = models.Author.objects.all()
        ser = MySerializer.AuthorSerializer(ret, many=True)
        response['data'] = ser.data
        return JsonResponse(response, safe=False)

 2.3區域性配置,全域性配置,區域性禁用

  • 與認證用法相同

2.4許可權使用順序

許可權類使用順序:先用檢視類中的許可權類,再用settings裡配置的許可權類,最後用預設的許可權類