Django REST framework - 认证

目录

  • 认证

    • DRF 5种验证方式
    • 如何确定身份验证?
    • 设置身份验证方案
    • 案例: 基于自定义Token认证
      • 第一步: 定义一个用户表和一个保存用户Token的表
      • 第二步: 定义一个登陆视图
      • 第三步定义一个认证类
      • 第四步: 使用认证类

认证

(我是谁?)

身份认证是将传入请求与一组标识凭据相关联的机制,然后,权限和限制策略可以使用这些凭据来确定是否应该允许该请求.

REST框架提供了许多开箱即用的身份验证方案,还允许您实现自定义方案。
身份验证始终在视图的最开始,在发生权限和限制检查之前,以及允许任何其他代码继续之前运行。

request.user 属性通常将设置为contrib.authUser类的实例。

request.auth 属性用于任何其他身份验证信息,例如,它可用于表示请求已签名的身份验证令牌。

DRF 5种验证方式

# 基于用户名和密码的认证
class BasicAuthentication(BaseAuthentication):
    pass

# 基于Session的认证
class SessionAuthentication(BaseAuthentication):
    pass

# 基于Tokend的认证
class TokenAuthentication(BaseAuthentication):
    pass

# 基于远端用户的认证(专用用户管理服务器)
class TokenAuthentication(BaseAuthentication):
    pass

如何确定身份验证?

身份验证方案始终定义为类列表。REST框架将尝试对列表中的每个类进行身份验证,并将设置request.user和request.auth使用成功进行身份验证的第一个类的返回值。

如果没有类进行身份验证,request.user则将设置为实例django.contrib.auth.models.AnonymousUser,request.auth并将其设置为None。

的价值request.user和request.auth对身份认证的请求可以通过修改UNAUTHENTICATED_USER和UNAUTHENTICATED_TOKEN设置。

设置身份验证方案

  1. 可以使用该DEFAULT_AUTHENTICATION_CLASSES设置全局设置默认认证方案。例如

     REST_FRAMEWORK = {
         'DEFAULT_AUTHENTICATION_CLASSES': (
             'rest_framework.authentication.BasicAuthentication',
             'rest_framework.authentication.SessionAuthentication',
      )
     }
  2. 您还可以使用APIView基于类的视图在每个视图或每个视图集的基础上设置身份验证方案。
     from rest_framework.authentication import SessionAuthentication, BasicAuthentication
     from rest_framework.permissions import IsAuthenticated
     from rest_framework.response import Response
     from rest_framework.views import APIView
    
     class ExampleView(APIView):
         authentication_classes = (SessionAuthentication, BasicAuthentication)
         permission_classes = (IsAuthenticated,)
    
         def get(self, request, format=None):
             content = {
                 'user': unicode(request.user),  # `django.contrib.auth.User` instance.
                 'auth': unicode(request.auth),  # None
             }
             return Response(content)
  3. 或者,如果您正在使用@api_view具有基于功能的视图的装饰器。
     @api_view(['GET'])
     @authentication_classes((SessionAuthentication, BasicAuthentication))
     @permission_classes((IsAuthenticated,))
     def example_view(request, format=None):
         content = {
             'user': unicode(request.user),  # `django.contrib.auth.User` instance.
             'auth': unicode(request.auth),  # None
         }
         return Response(content)

案例: 基于自定义Token认证

第一步: 定义一个用户表和一个保存用户Token的表

class UserInfo(models.Model):
    username = models.CharField(max_length=16)
    password = models.CharField(max_length=32)
    type = models.SmallIntegerField(
        choices=((0, '普通用户'), (1, 'VIP用户')),
        default=0
    )

class Token(models.Model):
    user = models.OneToOneField(to='UserInfo')
    token_code = models.CharField(max_length=128)

第二步: 定义一个登陆视图

from rest_framework.views import APIView
from app2 import models
from rest_framework.response import Response
import hashlib, time

def get_random_token(username):
    """
    根据用户名和时间戳生成随机token
    """
    timestamp = str(time.time())
    m = hashlib.md5(bytes(username, encoding="utf-8"))
    m.update(bytes(timestamp, encoding="utf-8"))
    return m.hexdigest()

class LoginView(APIView):
    """
    校验用户名是否正确从而生成token的视图
    """
    def post(self, request):
        res = {"code": 0}
        # print(request.data)
        username = request.data.get("username")
        password = request.data.get("password")

        user = models.UserInfo.objects.filter(username=username, password=password).first()
        if user:
            token = get_random_token(username)
            models.Token.objects.update_or_create(defaults={"token_code": token}, user=user)
            res["token"] = token
        else:
            res["code"] = 1
            res["error"] = "用户名或密码错误"
        return Response(res)

第三步定义一个认证类

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from app2 import models

class MyAuth(BaseAuthentication):
    def authenticate(self, request):
        # if request.method in ["POST", "PUT", "DELETE"]:  

        # 如果在表单中需要判断请求方式    由于表单是post请求,所以获取token 的方式为 request.data.get("token")
        # request.query_params为url中的参数
        request_token = request.query_params.get("token", None)
        if not request_token:
            raise AuthenticationFailed('q.缺少token')

        token_obj = models.Token.objects.filter(token_code=request_token).first()
        if not token_obj:
            raise AuthenticationFailed("无效的Token")
        # token_obj.user 通过token这张表的对象和user这个关联字段 找到 UserInfo表的对象及当前用户对象
        return token_obj.user, request_token

        # else:
        #     return None, None

第四步: 使用认证类

视图级别认证

# (用的不多)
class CommentViewSet(ModelViewSet):

    queryset = models.Comment.objects.all()
    serializer_class = app01_serializers.CommentSerializer
    authentication_classes = [MyAuth, ]

全局级别认证

# 在settings.py中配置
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.MyAuth", ]
}

原文地址:https://www.cnblogs.com/konghui/p/10351910.html

时间: 2024-11-14 02:05:50

Django REST framework - 认证的相关文章

Django Rest Framework 认证组件

'''用户认证章节''' # 用户认证章节:写一个数据接口 from django.http import JsonResponse from .utils import get_token from rest_framework.exceptions import APIException class UserView(APIView): def post(self, request): # 定义返回消息体 response = dict() # 定义需要的用户信息 fields = {"us

Django Rest Framework 认证组件(权限组件)

from rest_framework.viewsets import ModelViewSet from .authentication_classes import UserAuth from .permission_classes import UserPerm class BookView(ModelViewSet): # 在需要认证的数据接口里面指定认证类 authentication_classes = [UserAuth] # 在需要认证的数据接口里面指定权限类 permissio

Django REST framework 之 API认证

RESTful API 认证 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过 sessions 或 cookies 维护, 常用的做法是每个请求都发送一个秘密的 access token 来认证用户, 由于 access token 可以唯一识别和认证用户, API 请求应通过 HTTPS 来防止 man-in-the-middle(MitM)中间人攻击. 通

Django REST framework - 权限和限制

目录 Django REST framework 权限和限制 (你能干什么) 设置权限的方法 案例 第一步: 定义一个权限类 第二步: 使用 视图级别 全局级别设置 --- 限制 (你一分钟能干多少次?)**好像有点污~~ ### 第一步: 自定义限制类 第二步: 使用 嫌麻烦的话,还可以使用内置限制类,哈哈~ Django REST framework 权限和限制 (你能干什么) 与身份验证和限制一起,权限确定是应该授予还是拒绝访问请求. 在允许任何其他代码继续之前,权限检查始终在视图的最开始

Django rest framework 使用自定义认证方式

Django rest framework 使用自定义认证方式 Django使用自定义认证方式 介绍了 "Django使用自定义认证方式",这一篇说说怎样在前一篇的基础上提供rest api. 修改settings.py中INSTALLED_APPS,添加 'login' app. 给login app增加serializers.py文件 #coding:utf-8 from django.contrib.auth.models import User from rest_framew

Django Restful Framework【第三篇】认证、权限、限制访问频率

一.认证 认证请求头 views.py #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.authentication import BaseAuthentication from rest_framework.permissions import

源码剖析Django REST framework的认证方式及自定义认证

源码剖析Django REST framework的认证方式 由Django的CBV模式流程,可以知道在url匹配完成后,会执行自定义的类中的as_view方法. 如果自定义的类中没有定义as_view方法,根据面向对象中类的继承可以知道,则会执行其父类View中的as_view方法 在Django的View的as_view方法中,又会调用dispatch方法. 现在来看看Django restframework的认证流程 Django restframework是基于Django的框架,所以基

django rest framework 用户认证

BaseAuthentication 类: django rest framework 通过 BaseAuthentication 实现认证功能 无论是自定义的认证类还是 rest framework 自带的认证类都应该继承 BaseAuthentication BaseAuthentication 中有两个方法 authenticate 和 authenticate_header, 其中 authenticate 方法必须实现 如果用户需要自定义认证方法则继承 BaseAuthenticati

Django rest framework源码分析(一) 认证

一.基础 最近正好有机会去写一些可视化的东西,就想着前后端分离,想使用django rest framework写一些,顺便复习一下django rest framework的知识,只是顺便哦,好吧.我承认我是故意的,因为我始终觉得,如果好的技术服务于企业,顺便的提高一下自己.大家都很开心不是不.再次强调一下,真的只是顺便. 安装吧 pip install djangorestframework 1.2.需要先了解的一些知识 理解下面两个知识点非常重要,django-rest-framework