1. 程式人生 > >RestFramework之認證元件

RestFramework之認證元件

一、認證元件的介紹

  對於認證,我們一般有三種方式,即cookie, session,token,

  1. cookie,是將資訊存放在客戶端(瀏覽器上),資訊不安全;
  2. session,把資訊放在伺服器資料庫中,但是要是資訊量較大,對伺服器的壓力就會大大增加;
  3. token採用每次使用者登陸後為其設定一個隨機字串,即token值,使用者登陸之後,每次訪問都帶著這個token來訪問,服務端只需要驗證token值是否正確就可以,相對比較方便使用;

  所以,我們使用token做認證;

二、認證元件的使用

  首先需要編寫模型類這裡已經準備好了,主要是需要user表與token表。

class User(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    level = (
        (1, 'delux'),
        (2, 'vip'),
        (3, 'svip')
    )
    user_level = models.IntegerField(choices=level)


class UserToken(models.Model):
    token 
= models.CharField(max_length=128) user = models.OneToOneField('User', on_delete=models.CASCADE)

  然後需要編寫登陸檢視

class Loginview(APIView):
    # parser_classes = [JSONParser, FormParser]
    def get(self, request):
        return render(request, 'login.html')

    def post(self, request):
        
''' code: 200:登陸成功 201:使用者名稱或密碼錯誤 202:其他錯誤 :param request: :return: ''' res = {'code': None, 'user': None, 'message': None} try: username = request.data.get('username') password = request.data.get('password') user_obj = User.objects.filter(username=username, password=password).first() if user_obj: token_str = str(uuid.uuid4()).replace('-', '') UserToken.objects.update_or_create(user=user_obj, defaults={'token': token_str}) res['code'] = '200' res['user'] = username res['message'] = '登陸成功' res['token'] = token_str else: res['code'] = '201' res['message'] = '使用者名稱或密碼錯誤' except Exception as e: res['code'] = '202' res['message'] = e # print(request.data) # print(self.parser_classes) # res['succsess'] = request.data # res = json.dumps(res) return Response(res)

  準備工作做好之後我們來編寫認證類,在編寫之前需要匯入相關的包與模型類

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from app01.models import UserToken     # model中的模型類

  開始編寫認證類,

class UserAuth(BaseAuthentication):
    def authenticate(self, request):
        # 我們模仿get請求頁面
        token = request.query_params.get("token")  # 同request.GET.get("token")
        # 在token表中查詢有麼有這次請求攜帶的token值
        user_token_obj = models.UserToken.objects.filter(token=token).first()
        if user_token_obj:
            # 如果有值,說明是 正常使用者
            return user_token_obj.user, user_token_obj.token
            # 返回 當前的使用者物件,和當前的token值,這樣原始碼就會幫我們賦值給request物件了,我們在後面的request中就可以使用了
        else:
            raise AuthenticationFailed("認證失敗!")

  檢視類中只需要加入一行程式碼

authentication_classes = [UserAuth]  # 認證類

  這樣我們的認證元件就完成了。