rest-framework的认证组件

认证组件

1.登录认证(与组件无关):

首先要在model表内添加用户表和token表:

from django.db import models

# Create your models here.
class User(models.Model):
    name=models.CharField(max_length=32)
    pwd=models.CharField(max_length=32)

class Token(models.Model):
    user=models.OneToOneField("User",on_delete=models.CASCADE)
    token=models.CharField(max_length=128)
import hashlib,time
def get_random_str(user):
    ctime=str(time.time())
    md5=hashlib.md5(bytes(user,encoding="utf-8"))
    md5.update(bytes(ctime,encoding="utf-8"))

    return md5.hexdigest()

class LoginView(APIView):
    def post(self,request):
        name=request.data.get("name")
        pwd=request.data.get("pwd")
        user=User.objects.filter(name=name,pwd=pwd).first()
        res={"state_code":1000,"msg":None}
        if user:
            random_str=get_random_str(user.name)
            toekn=Token.objects.update_or_create(user=user,defaults={"token":random_str})
            res["token"]=random_str
        else:
            res["state_code"]=1001   #错误的状态码
            res["msg"]="用户名密码错误!"

        return Response(json.dumps(res))

2.局部认证:

# Author:Jesi
# Time : 2018/10/6 18:14
from .models import *
from rest_framework.authentication import BaseAuthentication

from rest_framework import exceptions
class  TokenAuth(BaseAuthentication):
    def authenticate(self,request):
        ‘‘‘函数名必须叫authenticate‘‘‘
        # 验证条件根据需求设置(此示例为需要有token值)
        token=request.GET.get("token")
        token_obj=Token.objects.filter(token=token).first()
        if not token_obj:
            # 如果验证失败,需要跑出AuthenticationFailed错误
           raise exceptions.AuthenticationFailed("验证失败!")
        else:
            # 如果验证成功,需要返回一个元组,分别是用户以及验证类的实例对象,然后内部会赋值给request.user和request.auth
            return token_obj.user.name,token_obj.token

    def authenticate_header(self,request):
        #加上上面的基础类继承,那么这个header方法就可以不用写了。
        pass

在视图中只需要加一句就OK了。

class BookView(APIView):
    authentication_classes = [TokenAuth]  # 注意,值为一个列表,可以放多个认证组件类名 
    def get(self,request):
        print(request.user)   #token_obj.user.name
        print(request.auth)   #token_obj.token
        book_list=Book.objects.all()
        # bs=BookSerializers(book_list,many=True)
        bs2=BookModelSerializers(book_list,many=True,context={‘request‘: request})
        # return Response(bs.data)
        return Response(bs2.data)

这里打印的2个request.user,request.auth分别就是上面认证类返回的token_obj.user.name和token_obj.token。是一个元组。

3.全局配置:

将认证类放到一个util.py的一个额外文件下:

# Author:Jesi
# Time : 2018/10/6 18:14
from .models import *
from rest_framework.authentication import BaseAuthentication

from rest_framework import exceptions
class  TokenAuth(BaseAuthentication):
    def authenticate(self,request):
        token=request.GET.get("token")
        token_obj=Token.objects.filter(token=token).first()
        if not token_obj:
           raise exceptions.AuthenticationFailed("验证失败!")
        else:
            return token_obj.user.name,token_obj.token

    def authenticate_header(self,request):
        #加上上面的基础类继承,那么这个header就可以不用写了。
        pass

然后在settings里面进行一个配置:

REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.utils.TokenAuth"]
}

这样全局就都拥有了认证的组件。如果要查看书籍,作者等操作的时候需要带上token通过认证类的验证才可以。

http://127.0.0.1:8000/books/?token=7f9038f36213a9e6aa6c3ad51043d9d0

最后:

这样配置之后,每个视图类都要经过认证成功之后才能执行下一步,如果有某些方法不需要认证,如login函数,则需要在login函数中单独加入一个配置属性:

authentication_classes = [] #自己的类里有的话就调用此类的配置,为空既什么都不做

原文地址:https://www.cnblogs.com/geogre123/p/9748051.html

时间: 2024-11-07 13:41:37

rest-framework的认证组件的相关文章

DRF Django REST framework 之 认证组件(五)

引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任何数据,有客户端请求,我即返回数据,简单方便,每一个http请求都是新的,响应之后立即断开连接. 而如今,互联网的世界发生了翻天覆地的变化,用户不仅仅需要跟其他用户沟通交流,还需要跟服务器交互,不管是论坛类.商城类.社交类.门户类还是其他各类Web站点,大家都非常重视用户交互,只有跟用户交互了,才能

rest framework认证组件和django自带csrf组件区别详解

使用 Django 中的 csrf 处理 Django中有一个django.middleware.csrf.CsrfViewMiddleware中间件提供了全局的csrf检查.它的原理是在<form>标签中生成一个隐藏的<input>标签,提交表单时将这个隐藏的<input>一起提交,服务器端验证这个字段是否正确. 官方给出的csrf的操作步骤是: 在MIDDLEWARE_CLASSES中添加django.middleware.csrf.CsrfViewMiddlewa

DAY99 - Rest Framework(四)- 认证组件和权限组件

一.认证组件 1.使用 # 模型层 class User(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32) class UserToken(models.Model): user = models.OneToOneField(to='User') token = models.CharField(max_length=64) #myAuth.py from app

基于Django的Rest Framework框架的认证组件

0|1一.认证组件的作用 在一个程序中有一些功能是需要登录才能使用的,原生Django中的auth组件可以用来解决这个认证问题,drf框架中也有对应的认证组件来解决这个问题. models.py from django.db import models # Create your models here. class User(models.Model): name = models.CharField(max_length=16) pwd = models.CharField(max_leng

三大认证组件

三大认证组件 认证Authentication 可以在配置文件中配置全局默认的认证方案 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', # session认证 'rest_framework.authentication.BasicAuthentication', # 基本认证 ) } 也可以在每个视图中通过设置authent

framework —— auth认证

framework -- auth认证 1.目录结构 2.urls.py from django.conf.urls import url from django.contrib import admin from app02 import views as app02_view urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^hosts/',app02_view.HostView.as_view()), url(r'^auth/

10.Django用户认证组件

用户认证组件: 功能:用session记录登录验证状态: 前提:用户表,django自带的auth_user 创建超级用户:python manage.py createsuperuser           kris的密码是abc123456 基于用户认证组件的登录验证信息储存 views.py from django.shortcuts import render, HttpResponse, redirect # Create your views here. from django.co

Django:(6)用户认证组件 &amp; 中间件

用户认证组件 用户认证组件: 功能:用session记录登陆验证状态 前提:用户表:django自带的auth_user 创建超级用户的命令: python manage.py createsuperuser API: (1)from django.contrib import auth (auth模块的方法) 1. # 做验证:如果 验证成功 返回 user 对象(就是 auth_user 这张表中的一条记录对象),否则返回None user = auth.authenticate(usern

源码剖析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的框架,所以基