dango框架学习:四十二.django-rest-framework.权限认证(permission)
前言
當用戶登錄后,才有操作當前用戶的權限,只可以操作自己的賬戶,不能操作別人的賬戶,怎樣實現?這就需要用到權限認證。
authentication是身份認證,用于判斷當前用戶的登錄方式是哪種認證方式。
permission是權限認證,判斷哪些用戶有操作權限
authentication身份認證
身份認證是將收到的請求和一組標識證書(如用戶密碼,令牌)進行關聯的一種機制,遍以權限和策略可以根據這個標識證書來決定是否允許該請求,因此身份認證驗證發生在驗證權限和限制檢查之前。
當收到的請求通過身份驗證時:
request.user的屬性會設置為django.contrib.auth.User對象,即我們登陸的對象(我們定義用戶繼承于User)。
request.auth的屬性會設置為對應的Token(如果帶有Token)或者None(如果不帶有Token)。
當收到請求身份驗證失敗時:
request.user的屬性會設置為django.contrib.auth.models.AnonymousUser對象。
request.auth會設置為None。
django rest framework權限和認證有四種方式:
BasicAuthentication 此身份驗證方案使用HTTP基本身份驗證,根據用戶的用戶名和密碼進行簽名。基本身份驗證通常僅適用于測試
TokenAuthentication 此身份驗證方案使用基于令牌的簡單HTTP身份驗證方案。令牌認證適用于客戶端 - 服務器設置,例如本機桌面和移動客戶端。
SessionAuthentication 此身份驗證方案使用Django的默認會話后端進行身份驗證。會話身份驗證適用于與您的網站在同一會話上下文中運行的AJAX客戶端。
RemoteUserAuthentication 此身份驗證方案允許您將身份驗證委派給Web服務器,該服務器設置REMOTE_USER 環境變量。
permission權限認證
權限檢查通常使用request.user和request.auth屬性中的身份驗證信息來確定是否應允許傳入請求。
當權限檢查失敗時,將根據一下規則返回Http403 Forbidden或Http 401 Unauthorized:
如果收到的請求身份驗證通過,但是權限驗證失敗,則返回Http403 Forbidden;
如果收到的請求身份驗證失敗,且最高優先級驗證類不能使用WWW-Authenticate請求頭,則返回403Forbidden;
如果收到的請求身份驗證失敗,且最高優先級驗證類能使用WWW-Authenticate請求頭,則返回401 Unauthorized;
權限級別也有四種:
AllowAny 允許所有用戶
IsAuthenticated 表示僅僅允許身份驗證通過的用戶訪問,其他用戶無法訪問。
IsAdminUser 表示僅僅允許管理員用戶訪問,普通用戶無法訪問。
IsAuthenticatedOrReadOnly 表示僅僅允許身份驗證通過的用戶訪問,或者只允許只讀請求(GET請求)訪問。
settings.py相關配置
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'ke25',
    'xadmin',
    'rest_framework',
    'rest_framework.authtoken',
]
settings.py文件可以全局配置,會對所有的接口生效,REST_FRAMEWORK添加權限認證方式和身份認證方式
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',  # token認證
    ),
    # 權限認證  全局配置
    'DEFAULT_PERMISSION_CLASSES':(
      #'rest_framework.permissions.IsAuthenticated',# IsAuthenticated 僅通過認證的用戶
      'rest_framework.permissions.AllowAny',# AllowAny 允許所有用戶
      #'rest_framework.permissions.IsAdminUser',# IsAdminUser 僅管理員用戶
      #'rest_framework.permissions.IsAuthenticatedOrReadOnly',  # IsAuthenticatedOrReadOnly 認證的用戶可以完全操作,否則只能get讀取   ),
)
}
局部添加權限
局部權限只針對當前的接口生效,登錄生成token,登錄允許所有已有用戶登錄,設置局部權限:
permission_classes = (AllowAny,) #允許所有用戶
from . import models
from django.shortcuts import render
from django.http import JsonResponse
from django.shortcuts import HttpResponse
from rest_framework.authtoken.models import Token
from django.contrib import auth
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated,AllowAny
from rest_framework.authentication import TokenAuthentication
from rest_framework import serializers
class LoginViewSet(APIView):
    '''登錄方法'''
    permission_classes = (AllowAny,) #允許所有用戶
    def post(self, request, *args, **kwargs):
        username = request.data.get('username')
        password = request.data.get('password')
        user = auth.authenticate(username=username, password=password)
        if not user:
            return JsonResponse({"code": 0,
                                "msg": "用戶名或密碼不對!"})
        # 刪除原有的Token
        old_token = Token.objects.filter(user=user)
        old_token.delete()
        # 創建新的Token
        token = Token.objects.create(user=user)
        return JsonResponse({"code": 0,
                             "msg": "login success!",
                             "username": user.username,
                             "token": token.key})
登錄成功后,關聯Card表,添加authentication身份認證permission權限認證
authentication_classes = (TokenAuthentication,) # token認證 permission_classes = (IsAuthenticated,) # # IsAuthenticated 僅通過認證的用戶
views.py代碼如下:
class CardAPISerializer(serializers.ModelSerializer):
    '''序列化數據的類,根據model表來獲取字段'''
    class Meta:
        model = models.Card
        fields = '__all__'
        # fields = ('card_id','card_user')
class CardListAPIView(APIView):
    '''REST framework的APIView實現獲取card列表 '''
    '''return list of all user'''
    authentication_classes = (TokenAuthentication,)#token認證
    permission_classes = (IsAuthenticated,)#IsAuthenticated僅通過認證的用戶
    def get(self, request, format=None):
        cards = models.Card.objects.all()
        serializer = CardAPISerializer(cards,many=True)
        return JsonResponse({"code":0,
                         "msg":"查詢成功",
                         "data":serializer.data})
    def post(self,request,format=None):
        '''create Card  反序列化'''
        verify_data = CardAPISerializer(data=request.data)  # 只改這里
        if verify_data.is_valid():  # 判斷數據是否合法
            verify_data.save()
            return JsonResponse({"code": 0,
                             "msg": "創建成功",
                             "data": request.data})
        else:
            return JsonResponse({"code": 0,
                             "msg": "創建成功",
                             "data":'request data invaild %s'% verify_data.errors})
models.py
from django.db import models
# Create your models here.
class Card(models.Model):
    card_id = models.IntegerField(verbose_name="卡號")
    card_user = models.CharField(verbose_name='姓名',max_length=128)
    add_time = models.DateTimeField(verbose_name='日期',auto_now_add=True)
    class Meta:
        verbose_name = '銀行卡賬戶'
        verbose_name_plural = '銀行卡賬戶信息'
    def __str__(self):
        return self.card_id
urls.py
url(r'^api/v1/login/$', vie.LoginViewSet.as_view()), url(r'api/v1/cardlist/$', vie.CardListAPIView.as_view()),
接口關聯測試
登錄接口
登錄接口response,獲取token值
將token添加到cardlist接口請求頭
如果token錯誤,或者沒有token就會出現401 Unauthorized
總結
以上是生活随笔為你收集整理的dango框架学习:四十二.django-rest-framework.权限认证(permission)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 图灵学院-微服务11-分布式链路跟踪Sl
- 下一篇: 如何清除DNS缓存,使用cmd命令清理D
