Django - DRF身份认证组件

  • 作者:lwj
  • 分类:Django
  • 发表日期:2021-12-11 14:31:00
  • 阅读(61)
  • 评论(0)

DRF身份认证方式:

BasicAuthentication:基本身份验证方案使用HTTP基本身份认证,根据用户的用户名和密码进行签名(仅适用于测试)

TokenAuthentication:令牌验证方案使用简单的基于令牌的 HTTP 身份验证方案。令牌身份验证适用于客户端-服务器设置,例如本机桌面和移动客户端

SessionAuthentication:Session身份验证方案使用Django的默认会话后端进行身份验证。会话身份验证适用于在与您的网站相同的会话上下文中运行的AJAX 客户端

RemoteUserAuthentication: 远程身份验证方案允许您将身份验证委托给设置REMOTE_USER 环境变量的Web 服务器

注:要使用TokenAuthentication方案,您需要配置身份认证类以包含TokenAuthentication,并另外包含rest_framework.authtoken在您的INSTALLED_APPS设置中:

INSTALLED_APPS = [
    ...
    'rest_framework.authtoken'
]

登录视图生成token

# coding: utf-8
# Author: sitVen

from django.http import JsonResponse
from django.contrib import auth
from rest_framework.views import APIView
from rest_framework.authtoken.models import Token

class LoginViewSet(APIView):

    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(data={"code": 0, "msg": "用户名或密码错误"})
        old_token = Token.objects.filter(user=user)       # 删除存在的旧Token
        old_token.delete()
        token = Token.objects.create(user=user)           # 创建新的Token写入到表
        return JsonResponse(
            data={
                "code": 0,
                "msg": "login success!",
                "username": user.username,
                "token": token.key
            }
        )

注:需要执行数据库迁移,会创建一个authtoken_token表存放token和登录的user_id

登录接口通过账号密码登录返回结果如下图:


DRF身份认证配置策略:全局身份认证和视图身份认证

全局身份认证需要在setting.py文件夹中添加配置(配置后所有接口均要进行身份认证):

# DRF的所有配置项
REST_FRAMEWORK = {
    # 身份认证
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',    # 基本认证
        'rest_framework.authentication.SessionAuthentication',  # session认证
        'rest_framework.authentication.TokenAuthentication',    # token认证
    ),
}

视图身份认证则在需要认证的视图中配置,如下只有视图只有用户才能请求该视图接口:

from rest_framework.viewsets import ModelViewSet
from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import TokenAuthentication

from .models import BookInfo
from .serializers import BookInfoSerializers

class ViewAuth(ModelViewSet, GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializers

    # 指定Token认证
    authentication_classes = [TokenAuthentication, ]
    # IsAuthenticated只有登录用户才能操作视图中的所有接口
    permission_classes = [IsAuthenticated]

未带Token请求会提示身份认证信息未提供,HTTP状态码返回401

正确的Token请求,返回数据,HTTP状态码为200

 

觉得不错,支持一下!

提交评论

您尚未登录,登录之后方可评论~ 登录 or 注册

评论列表

暂无评论
返回顶部

建议反馈

1. 可在博文底部留言评论

2. 发邮件到i_suichuan@163.com