五, Authentication和Permissions
概述
在介绍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的更多相关文章
- drf06 认证Authentication 权限Permissions 限流Throttling
为了方便接下来的学习,我们创建一个新的子应用 four python manage.py startapp four 因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并 ...
- Django Rest Framework API指南
Django Rest Framework API指南 Django Rest Framework 所有API如下: Request 请求 Response 响应 View 视图 Generic vi ...
- 关于如何在Android、Java等非微软平台上建立高信任的SharePoint应用程序
关于如何在非微软平台上建立高信任的SharePoint应用程序 原文 :http://blogs.msdn.com/b/kaevans/archive/2014/07/14/high-trust-sh ...
- Microsoft 家族新成员 Datazen 移动BI 介绍
开篇介绍 Microsoft 在上个月即 2015年4月份收购了 Datazen www.datazen.com, Datazen 专注于移动 BI 和数据可视化领域,并且它的基本部署与配置架构都是基 ...
- django User model
django User model operation this tutorial will guide us to know how to manipulate django User model. ...
- facebook api之Access Tokens之Business Manager System User
Business Manager System User Make programatic, automated actions on ad objects or Pages, or do progr ...
- facebook api之Business Manager API
Business-scoped Users - The new user is tied to a particular business and has permissions scoped to ...
- Hadoop学习之路(十)HDFS API的使用
HDFS API的高级编程 HDFS的API就两个:FileSystem 和Configuration 1.文件的上传和下载 package com.ghgj.hdfs.api; import org ...
- Tutorial 7: Schemas & client libraries
转载自:http://www.django-rest-framework.org/tutorial/7-schemas-and-client-libraries/ Tutorial 7: Schema ...
随机推荐
- tp3.2 支付宝app支付
pay方法 /** *支付宝支付 */ public function pay($param) { vendor('alipay.AopSdk');// 加载类库 $config = array( ' ...
- Linux架构分布式集群之基础篇
部署linux环境,安装jdk 1.安装rar命令行 wget http://www.rarlab.com/rar/rarlinux-x64-4.2.0.tar.gz由于在此目录下解压rar后linu ...
- centos7 jdk
查看已经自带的jdk: rpm -qa | grep jdk 卸载 sudo yum remove XXX 1.下载 jdk-8u101-linux-x64.rpm http://www.orac ...
- css自定义鼠标
亲们支持我的新博客哦==>地址(以后更新会尽量在新博客更新,欢迎大家访问加入我的后宫w) ) css自定义鼠标 效果展示==> 注意: 1.支持jpg/png/ico格式的展示鼠标格式,为 ...
- c# 中实用包,实用dll。
Aspose.cell:用与操作Excel,生成,导入导出等. ICSharpCode.SharpZipLib.dll:用户压缩及解压ZIP包,根据需要也可以加密.
- CentOS7自定义安装git
1. 介绍 使用Coding管理项目,上面要求使用的git版本为1.8.0以上,而很多yum源上自动安装的git版本为1.7,所以需要掌握手动编译安装git方法. 2. 安装git依赖包yum ins ...
- Spring和SpringBoot比较,解惑区别
1.概述: 对于Spring和SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习SpringBoot的我当时也是一头雾水,随着经验的积累.我慢慢理解了这两个框架到底有什么区别,我相信 ...
- linux环境下Mysql的卸载和重新安装和启动
MySql安装 1 安装包准备 1.查看mysql是否安装,如果安装了,卸载mysql (1)查看 [root@hadoop102 桌面]# rpm -qa|grep mysqlmysql-libs- ...
- python ftp文件夹文件递归上传推送
- Yii实战中8个必备常用的扩展,模块和widget
Yii实战中8个必备常用的扩展,模块和widget 在经过畅K网 的实战后,总结一下在Yii的项目中会经常用到的组件和一些基本的使用方法,分享给大家,同时也给自己留个备忘录,下面我以代码加图片说明. ...