RestFramework自定制之认证、权限、限制访问频率

认证

  所谓认证就是检测用户登陆与否,通常与权限对应使用。网站中都是通过用户登录后由该用户相应的角色认证以给予对应的权限。

自定制认证规则的重点是继承内置的BaseAuthentication类,重写其authenticate()方法

方式一:通过url传参进行认证

from django.conf.urls import url, include
from app01.views import TestView

urlpatterns = [
    url(r‘^test/‘, TestView.as_view()),
]

ulrs.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authentication import BaseAuthentication
from rest_framework.request import Request
from rest_framework import exceptions

######伪造的数据库中存有的token########
token_list = [
    ‘sfsfss123kuf3j123‘,
    ‘asijnfowerkkf9812‘,
]

######自定制的认证规则的类,必须继承BaseAuthentication#####
class TestAuthentication(BaseAuthentication):
    def authenticate(self, request):
        """
        用户认证,如果验证成功后返回元组: (用户,用户Token)
        :param request:
        :return:
            None,表示跳过该验证;
                如果跳过了所有认证,默认用户和Token和使用配置文件进行设置
                self._authenticator = None
                if api_settings.UNAUTHENTICATED_USER:
                    self.user = api_settings.UNAUTHENTICATED_USER()
                else:
                    self.user = None

                if api_settings.UNAUTHENTICATED_TOKEN:
                    self.auth = api_settings.UNAUTHENTICATED_TOKEN()
                else:
                    self.auth = None
            (user,token)表示验证通过并设置用户名和Token;
            AuthenticationFailed异常
        """
        val = request.query_params.get(‘token‘)
        if val not in token_list:
            raise exceptions.AuthenticationFailed("用户认证失败")

        return (‘登录用户‘, ‘用户token‘)

    def authenticate_header(self, request):
        """
        Return a string to be used as the value of the `WWW-Authenticate`
        header in a `401 Unauthenticated` response, or `None` if the
        authentication scheme should return `403 Permission Denied` responses.
        """
        # 验证失败时,返回的响应头WWW-Authenticate对应的值
        pass

#####视图函数,必须继承APIView#####
class TestView(APIView):
    authentication_classes = [TestAuthentication, ]#中括号中写入定义了认证规则的类
    permission_classes = []#这是权限规则,下文会进行详述

#只有通过了上述的规则,才能以下执行视图函数
    def get(self, request, *args, **kwargs):
        print(request.user)
        print(request.auth)
        return Response(‘GET请求,响应内容‘)

    def post(self, request, *args, **kwargs):
        return Response(‘POST请求,响应内容‘)

    def put(self, request, *args, **kwargs):
        return Response(‘PUT请求,响应内容‘)

views.py

方式二:通过请求头认证

from django.conf.urls import url, include
from app01.views import TestView

urlpatterns = [
    url(r‘^test/‘, TestView.as_view()),
]

ulrs.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authentication import BaseAuthentication
from rest_framework.request import Request
from rest_framework import exceptions

#####自定制认证规则的类#####
class TestAuthentication(BaseAuthentication):
    def authenticate(self, request):
        """
        用户认证,如果验证成功后返回元组: (用户,用户Token)
        :param request:
        :return:
            None,表示跳过该验证;
                如果跳过了所有认证,默认用户和Token和使用配置文件进行设置
                self._authenticator = None
                if api_settings.UNAUTHENTICATED_USER:
                    self.user = api_settings.UNAUTHENTICATED_USER()
                else:
                    self.user = None

                if api_settings.UNAUTHENTICATED_TOKEN:
                    self.auth = api_settings.UNAUTHENTICATED_TOKEN()
                else:
                    self.auth = None
            (user,token)表示验证通过并设置用户名和Token;
            AuthenticationFailed异常
        """
        import base64
        auth = request.META.get(‘HTTP_AUTHORIZATION‘, b‘‘)#获取请求头
        if auth:
            auth = auth.encode(‘utf-8‘)#将bytes类型编码成utf-8
        auth = auth.split()
        if not auth or auth[0].lower() != b‘basic‘:
            raise exceptions.AuthenticationFailed(‘验证失败‘)
        if len(auth) != 2:
            raise exceptions.AuthenticationFailed(‘验证失败‘)
        username, part, password = base64.b64decode(auth[1]).decode(‘utf-8‘).partition(‘:‘)
        if username == ‘Damon‘ and password == ‘123‘:
            return (‘登录用户‘, ‘用户token‘)
        else:
            raise exceptions.AuthenticationFailed(‘用户名或密码错误‘)

    def authenticate_header(self, request):
        """
        Return a string to be used as the value of the `WWW-Authenticate`
        header in a `401 Unauthenticated` response, or `None` if the
        authentication scheme should return `403 Permission Denied` responses.
        """
        return ‘Basic realm=api‘

class TestView(APIView):
    authentication_classes = [TestAuthentication, ]#中括号中放入自定制的类,可放入多个
    permission_classes = []

    def get(self, request, *args, **kwargs):
        print(request.user)
        print(request.auth)
        return Response(‘GET请求,响应内容‘)

    def post(self, request, *args, **kwargs):
        return Response(‘POST请求,响应内容‘)

    def put(self, request, *args, **kwargs):
        return Response(‘PUT请求,响应内容‘)

views.py

原文地址:https://www.cnblogs.com/zhuminghui/p/8452733.html

时间: 2024-11-06 21:55:57

RestFramework自定制之认证、权限、限制访问频率的相关文章

REST framework (组件使用之认证、权限、访问频率)

目录 一.认证 二.权限 三.限制访问频率 四.总结 一.认证(补充的一个点) 认证请求头 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 from rest_framework.views import APIView 4 from rest_framework.response import Response 5 from rest_framework.authentication import BaseAuthentication 6

rest_framework组件之认证,权限,访问频率

共用的models 1 from django.db import models 2 3 4 # Create your models here. 5 6 7 class User(models.Model): 8 username = models.CharField(max_length=32) 9 password = models.CharField(max_length=32) 10 user_type = models.IntegerField(choices=((1, '超级用户'

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

基于asp.net MVC 的服务器和客户端的交互(二)之获取Oauth 2.0认证权限

基本Web API的ASP.NET的Oauth2认证 增加Token额外字段 增加Scope授权字段 持久化Token 设计Token的时间间隔 刷新Token后失效老的Token 自定义验证[重启IIS池Token失效,验证权限] Oauth2 认证的流程 客户端发送口令(grant_type,client_id,client_secret)到服务端请求,认证返回access token ,然后客户端跟据获得的access token,根据Access Token获得权限去访问Web API.

RESTful-rest_framework认证组件、权限组件、频率组件-第五篇

认证组件格式: 1 写一个认证类 from rest_framework.authentication import BaseAuthentication class MyAuth(BaseAuthentication): def authenticate(self,request): # request 是封装后的 token = request.query_params.get('token') ret = models.UserToken.objects.filter(token=toke

【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限

开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他URL,均跳转至登录页面 ② 登录涉及帐号和密码,帐号错误提示帐号错误,密码错误提示密码错误 ③ 登录成功跳转至首页,首页显示登录者帐号信息,并有注销帐号功能,点击注销退出系统 ------------------------------------------------------------------

SAP云解决方案和企业本地部署(On-Premise)混合架构下的安全认证权限管理

SAP提供了用户认证.权限管理和单点登录等安全相关的解决方案.但是随着云平台的兴起,企业已经部署的安全解决方案如何与云平台的安全解决方案集成呢?这是摆在我们面前的一个问题,而且是一个至关重要.需要认真思考的问题. 本文将探讨SAP提供的本地部署和云平台的安全解决方案产品集:SAP Single Sign-On, SAP Cloud Platform Identity Authentication, SAP Identity Management, 和SAP Cloud Platform Iden

DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分页组件 七 xxx 八 xxx 一 认证组件 1. 局部认证组件 我们知道,我们不管路由怎么写的,对应的视图类怎么写的,都会走到dispatch方法,进行分发, 在咱们看的APIView类中的dispatch方法的源码中,有个self.initial(request, *args, **kwargs),那么认证.权限.频率这三个默认组件都在这个方法里面了,如果我们自己没有做这三个组件的配置,那么会使用源码中默

认证组件、权限组件、频率组件

认证组件.权限组件.频率组件 一.Django权限六张表 1.1.content_type表 """ Course: name.type.days.price.vip_type 基础 免费课 7 0 中级 学位课 180 69 究极 会员课 360 至尊会员 Course: name.type.days.content_type_id 基础 免费课 7 null 中级 学位课 180 1 究极 会员课 360 2 app01_course_1 id.price app01_c