概述

在介绍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. Mapreduce入门和优化方案

    MapReduce基本原理和高性能网络下优化: Mapreduce概述 Mapreduce式谷歌开源的一项重要技术,是一个编程模型,用来进行大数据量的计算,对于大数据量的计算通常采用的处理方式式并行计 ...

  2. http与https之间的区别

    超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂 ...

  3. PHP:导出数据到word(包含图片)

    1.方法 public function word() { $xlsModel = M('api_aliucheng'); $Data = $xlsModel->Field('id,u_name ...

  4. 点不到的NO

    <!DOCTYPE html> <html>     <head>         <meta charset="UTF-8">   ...

  5. vuejs实现瀑布流布局(三)

    前面写过vuejs实现的瀑布流布局,<vuejs实现瀑布流布局(一)>和<vuejs实现瀑布流布局(二)>也确实实现了瀑布流布局,但是这个是基于SUI-Mobile实现的无限滚 ...

  6. 【Selenium-WebDriver自学】Selenium-RC脚本编写(十)

    ==================================================================================================== ...

  7. [UGUI]Text文字效果

    参考链接: http://www.xuanyusong.com/archives/3471 https://www.cnblogs.com/lyh916/p/9162463.html https:// ...

  8. JAVA 本地序列化。

    HashMap map = new HashMap(); map.put("province", "北京"); map.put("coding&quo ...

  9. centos7扩展根分区

    参考网站:http://www.360doc.com/content/18/0128/11/52410512_725728162.shtml VirtualBox中安装了CentOS 7,给同事用来做 ...

  10. window.location.search的用法 和 地址栏的的javsscript编码与解码

    ocation.search是从当前URL的?号开始的字符串 如:http://www.51js.com/viewthread.php?tid=22720 它的search就是?tid=22720 e ...