概述

在介绍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, )

最新文章

  1. 使用TypeScript开发
  2. h5移动端-1
  3. createElement,createTextNode,appendChild
  4. wampserver的php.ini文件
  5. MySQL使用小记
  6. HTML布局篇之双飞翼(圣杯)布局
  7. 操作SQLite数据库
  8. HTML的列表标签
  9. phpcms v9 数据库分离部署
  10. dojo.byId、dojo.query、dojo.attr
  11. 基于springmvc的简单增删改查实现---中间使用到了bean validation
  12. Segmentation Faul
  13. Java课程设计——象棋(201521123042 姚佳希)
  14. android自定义文本框,后面带清空按钮
  15. DedeCMS首页调用缩略图为背景
  16. cmd命令往MySQL数据库提交数据
  17. ES6标准之基础
  18. CSS 颜色
  19. c语言gets()函数与它的替代者fgets()函数
  20. ****timeago.js插件:jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例

热门文章

  1. C#的两种类据类型:值类型和引用类型
  2. 乌龟svn不能拉取代码的原因
  3. mysql数据库创建编码及排序
  4. 作为sort()方法的参数的比较函数(高程三第五章)
  5. C#串口通讯,16进制与字符串、字节数组之间的转换。
  6. JS中点击事件冒泡阻止
  7. 后台设计的基石:用户权限管理(RBAC)及工作流(workflow)模型
  8. LInux 阿里云系统遇到挖矿程序
  9. springboot 停止
  10. virtual 初探