概述

在介绍Django REST Framework(二):Request和Response 时提到,DRF提供了对身份验证和权限的处理机制,特点如下:

  • 1.对API的不同部分使用不同的认证策略;
  • 2.支持多种身份验证策略;
  • 3.对每个请求提供了用户和token信息。

在这篇文章中,将对身份验证和权限进行总结。使用时需要导入对应包:

from rest_framework import authenication
from rest_framework import permissions

NOTE:
由于是身份验证,因此我们首先得创建一个用户,Django中可通过如下命令创建一个管理员用户:
python manange.py createsuperuser

1.Authentication

身份验证是将收到的请求和一组标识证书(如用户名密码、令牌)进行关联的一种机制,以便权限和策略可以根据这个标识证书来决定是否允许该请求。因此,身份验证发生在验证权限和限制检查之前。

当收到的请求通过身份验证时:

request.user属性会设置为django.contrib.auth.User对象,即我们登录的对象(我们定义用户继承于User)。
request.auth会设置为对应的Token(如果带有Token)或者None(如果不带有Token)。
当收到请求身份验证失败时:

  • request.user属性会设置为django.contrib.auth.models.AnonymousUser对象。
  • request.auth会设置为None。

1.1.验证方式(Authentication Scheme)

rest_framework.auth中提供了以下四个身份验证方式:

1.BasicAuthentication

使用HTTP、HTTPS的基本验证方式进行身份验证,即username/password验证方式,验证失败则返回HTTP 401 Unauthorized响应。

2.SessionAuthentication

使用Django的Session后台框架进行身份验证,验证失败则返回HTTP 403 Forbidden响应。

3.TokenAuthentication

基于Token的身份验证方式,客户端在请求时携带有一个Authorization的请求头,和一个以”Token”开头的字符串,如:

Authorization: Token 401f7ac837da42b97f613d789819ff93537bee6a

如果验证失败,返回HTTP 401 Unauthorized响应。

使用TokenAuthentication时,需要使用Token Model来创建一个数据表,做如下配置:

INSTALLED_APPS = (
...
'rest_framework.authtoken'
)

运行python manage.py makemigrations和python manage.py migrate之后会生成一张authtoken_token的数据表,用来存放Token信息。

实际上,TokenAuthentication这种验证方式是每当创建一个用户,会生成对应的一个Token信息,并将该Token信息存放在数据表中。当收到请求时,将请求头中携带的Token和数据表中的Token进行验证,如果匹配则验证通过。因此,这种方式有两个缺点:

  • 1.如果是分布式系统,则在每个主机上都需要同步数据表中的Token信息;
  • 2.数据库中的数据无过期时间,一旦泄露,则带来安全问题。

因此,在项目开发中经常使用另一个基于Token的验证方式——JSONWebToken,关于JWT相关内容会在之后的文章中进行总结。

1.4.RemoteUserAuthentication

远程用户验证,将身份验证委托给服务器进行,服务器中必须有REMOTE_USER环境变量。

1.2.配置Authientacation Scheme

配置验证方式有两种方式:

1.配置全局默认验证方式

配置全局默认验证方式对所有View都有效,在项目配置文件settings.py中使用DEFAULT_AUTHENTICATION_CLASSES:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
)
}

上述配置也是默认配置。

2.配置当前View的验整方式

from rest_framework import authentication

class Show(viewsets.ModelViewSet):

    serializer_class = SnippetSerializer
queryset = Snippet.objects.all() authentication_classes = (authentication.BasicAuthentication,)

由于Authenication仅仅是进行身份校验(根据request标记凭据),它并不能对接收的请求进行限制,如果需要对请求进行限制,还需要使用Permission进行限制。

2.Permission

权限检查通常使用request.user和request.auth属性中的身份验证信息来确定是否应允许传入请求。

当权限检查失败时,将根据以下规则返回HTTP 403 Forbidden或HTTP 401 Unauthorized:

  • 1.如果收到的请求身份验证通过,但是权限验证失败,则返回HTTP 403 Forbidden;
  • 2.如果收到的请求身份验证失败,且最高优先级验证类不能使用WWW-Authenticate请求头,则返回HTTP 403 Forbidden;
  • 3.如果收到的请求身份验证失败,且最高优先级验证类可以使用WWW-Authenticate请求头,则返回HTTP 401 Unauthorized。

2.1.权限级别

1.IsAuthenticated

表示仅仅允许身份验证通过的用户访问,其他用户无法访问。

2.IsAuthenticatedOrReadOnly

表示仅仅允许身份验证通过的用户访问,或者只允许只读请求(GET请求)访问。

3.IsAdminUser

表示仅仅允许管理员用户访问,普通用户无法访问。

其它权限不常用,就不一一整理,参考请见官方文档.

2.2.配置权限

配置权限也有两种方式:

1.配置全局默认访问权限

在settings.py中,用DEFAULT_PERMISSION_CLASSES配置:

REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}

  

2.配置当前View访问权限

from rest_framework.permissions import IsAuthenticated

class Show(viewsets.ModelViewSet):

    serializer_class = SnippetSerializer
queryset = Snippet.objects.all()
authentication_classes = (authentication.BasicAuthentication,)
permission_classes = (IsAuthenticated, )

五, Authentication和Permissions的更多相关文章

  1. drf06 认证Authentication 权限Permissions 限流Throttling

    为了方便接下来的学习,我们创建一个新的子应用 four python manage.py startapp four 因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并 ...

  2. Django Rest Framework API指南

    Django Rest Framework API指南 Django Rest Framework 所有API如下: Request 请求 Response 响应 View 视图 Generic vi ...

  3. 关于如何在Android、Java等非微软平台上建立高信任的SharePoint应用程序

    关于如何在非微软平台上建立高信任的SharePoint应用程序 原文 :http://blogs.msdn.com/b/kaevans/archive/2014/07/14/high-trust-sh ...

  4. Microsoft 家族新成员 Datazen 移动BI 介绍

    开篇介绍 Microsoft 在上个月即 2015年4月份收购了 Datazen www.datazen.com, Datazen 专注于移动 BI 和数据可视化领域,并且它的基本部署与配置架构都是基 ...

  5. django User model

    django User model operation this tutorial will guide us to know how to manipulate django User model. ...

  6. facebook api之Access Tokens之Business Manager System User

    Business Manager System User Make programatic, automated actions on ad objects or Pages, or do progr ...

  7. facebook api之Business Manager API

    Business-scoped Users - The new user is tied to a particular business and has permissions scoped to ...

  8. Hadoop学习之路(十)HDFS API的使用

    HDFS API的高级编程 HDFS的API就两个:FileSystem 和Configuration 1.文件的上传和下载 package com.ghgj.hdfs.api; import org ...

  9. Tutorial 7: Schemas & client libraries

    转载自:http://www.django-rest-framework.org/tutorial/7-schemas-and-client-libraries/ Tutorial 7: Schema ...

随机推荐

  1. Django中的中间件(middleware)

    中间件: 在研究中间件的时候我们首先要知道 1 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Djang ...

  2. SPOJ COT3 - Combat on a tree

    /* 考虑直接使用暴力来算的话 SG[i]表示以i为根的子树的SG值, 然后考虑枚举删除那个子树节点, 然后求拆成的树的sg异或值, 求mex即可 复杂度三次方 然后考虑尝试 整体来做 发现对于每次子 ...

  3. python函数的创建和函数参数

    [1]#函数的作用:1.减少重复代码 2.方便修改,更容易扩展3.保持代码的一致性 [2]#函数简单的定义规则: 函数代码块以def关键词开头,后接函数标识符名称和圆括号(),任何传入参数和自变量必须 ...

  4. qt tcp 通信实例

    #include "mainwindow.h" #include "ui_mainwindow.h" #include <QHostAddress> ...

  5. 【译】在Flask中使用Celery

    为了在后台运行任务,我们可以使用线程(或者进程). 使用线程(或者进程)的好处是保持处理逻辑简洁.但是,在需要可扩展的生产环境中,我们也可以考虑使用Celery代替线程.   Celery是什么? C ...

  6. 重识linux-压缩文件的原理

    1 一种压缩原理 在系统中,系统使用byte作为最小单位来描述文件大小,但是计算机最小的单位是bit 一个byte=8bit,通常描述一个文件,计算机是使用0和1来存储的,所以系统工程师利用技术把为0 ...

  7. 关于xampp默认安装后mysql/mariadb密码的修改

    关于xampp默认按照后mysql/mariadb密码的修改 默认安装的mysql/mariadb 是没有密码的 只能跳过  然后进行修改密码 /opt/lampp/bin/mysqld_safe - ...

  8. UI学习网站

    以下是我收集的UI设计的网站提供给大家参考: 站酷 www.zcool.com.cn UI中国 www.ui.cn 学UI网 www.xueui.cn UIGREAT www.uigreat.com ...

  9. nginx 虚拟主机、反向代理服务器及负载均衡,多台主机分离php-fpm实验

    一.简介 本章介绍一些架构原理基础知识, 1.1.LNMP及php-fpm 请参考https://www.cnblogs.com/zhangxingeng/p/10242902.html 1.2.透明 ...

  10. 爬虫--Scrapy-CrawlSpider&基于CrawlSpide的分布式爬虫

    CrawlSpider 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调par ...