1. 程式人生 > >rest-framework認證、許可權元件

rest-framework認證、許可權元件

認證元件:

  models

 1 class User(models.Model):
 2     username = models.CharField(max_length=32)
 3     password = models.CharField(max_length=32)
 4     user_type_entry = (
 5         (1,"Delux"),
 6         (2,"SVIP"),
 7         (3,"VVIP"),
 8     )
 9     user_type = models.IntegerField(choices=user_type_entry)
10 11 def __str__(self): 12 return self.username 13 14 15 class UserToken(models.Model): 16 user = models.OneToOneField("User",on_delete=models.CASCADE) 17 token = models.CharField(max_length=128)

  寫一個認證類

 1 from rest_framework.authentication import BaseAuthentication
 2
from rest_framework.exceptions import APIException 3 4 from app01.models import UserToken 5 6 7 class UserAuth(BaseAuthentication): 8 # 所有認證的邏輯都在authenticate中 9 def authenticate(self, request): 10 user_token = request.GET.get("token") 11 token = UserToken.objects.filter(token=user_token).first()
12 if token: 13 return token.user, token.token 14 else: 15 raise APIException("沒有認證!")

  views中

 1 class UserView(APIView):
 2 
 3     def post(self,request):
 4         # 定義返回訊息
 5         response = dict()
 6         # 定義需要的使用者資訊
 7         fields = {"username", "password"}
 8         # 定義一個使用者資訊字典
 9         user_info = dict()
10 
11         if fields.issubset(set(request.data.keys())):
12             for key in fields:
13                 user_info[key] = request.data[key]
14 
15         user_obj = User.objects.filter(**user_info).first()
16 
17         if user_obj:
18             access_token = get_random_str()
19             UserToken.objects.update_or_create(user=user_obj,defaults={
20                 "token": access_token
21             })
22 
23             response["status_code"] = 200
24             response["status_message"] = "登入成功"
25             response["access_token"] = access_token
26             response["user_role"] = user_obj.get_user_type_display()
27         else:
28             response["status_code"] = 201
29             response["status_message"] = "登入失敗,使用者名稱或密碼錯誤"
30 
31         return Response(response)

  許可權類

1 from rest_framework.permissions import BasePermission
2 
3 class UserPerm(BasePermission):
4     message = "您沒有檢視資料的許可權!"
5 
6     def has_permission(self,request,view):
7         if request.user.user_type == 3:
8             return True
9         return False

  在需要認證和許可權的檢視類中加入

1 class BookView(ModelViewSet):
2     authentication_classes = [UserAuth]
3     permission_classes = [UserPerm]
4     queryset = Book.objects.all()
5     serializer_class = BookSerializer