Django REST framework:Authentication与Permissions

一、概念

Authentication即验证,Permissions即权限。

Authentication验证是将传入请求与一组标识凭据(例如请求来自的用户或用于签名的令牌)相关联的机制。然后,Permissions权限决定了是否应该授予或拒绝访问请求。

这里一定要注意,只配置了Authentication,接口依然是可以访问的。决定接口是否能够访问需要与Permissions一起配置。

二、Authentication

1、设置验证方案的3种方式:

(1)在settings中设置全局默认身份验证方案DEFAULT_AUTHENTICATION_CLASSES:

(2)使用装饰器,在基于函数的视图上设置身份验证方案:

(3)使用APIView基于类的视图在每个视图或每个视图集的基础上设置身份验证方案:

2、身份认证类

(1)基本认证:BasicAuthentication

(2)会话认证:SessionAuthentication

(3)令牌认证:TokenAuthentication

首先,在APP中增加rest_framework.authtoken,如图:

第二,执行命令python manage.py migrate同步数据库表,auth_user表是django框架生成的用户表,接下来就使用这个表来保存用户的信息;authtoken_token表是和用户登录认证相关的数据表,用来存放用户token。

第三,我们创建一个用户,用于后期的登录测试,执行命令:python manage.py createsuperuser,创建成功后auth_user表就有了刚刚创建的数据。

接下来,我们来实现这个登录接口,编写views.py:

配置urls.py:

大家自行用接口测试工具提交post请求到登录接口,我这边就使用了DRF自带的界面操作:

按照接口定义返回了token

因为是首次登录,所以会为该用户创建token,即authtoken_token会产生一条记录:

到这里就完成了登录认证,大家可以用接口测试工具测试,如果请求头中不包含该token,那么无法获取到数据:

headers中不包含token

如果请求头中包含token,以字符串文字“Token”为前缀,用空格分隔两个字符串。例如:请求头的格式:"Authorization":"Token XXXXXXXXXXXXXXXXXXXXXXXX"

(4)第三方包DRF-JWT

JWT:json web tokens,采用json格式在web上传输的认证字符串。

DRF中对应的JWT包为:django-rest-framework-jwt,安装pip install djangorestframework-jwt,增加认证配置:

在项目的urls.py中配置:

编写views.py:

测试一下,成功:

前端的其他请求,需要在请求头中加入token,格式如下:"Authorization":"JWT <token>",如果希望token的前缀不要是JWT,例如是Bearer,可在settings中配置JWT_AUTH,如:

注意:由于drf-jwt的登录验证默认只支持使用username。

三、Permissions

权限决定了是否应该授予或拒绝访问请求。

权限检查总是在视图的最开始运行,在任何其他代码被允许继续之前。

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

1、设置权限方案的3种方式

与Authentication设置一致。

2、权限类型

IsAuthenticated:最简单的权限样式,允许任何经过身份验证的用户访问,并拒绝任何未经身份验证的用户访问。

IsAuthenticatedOrReadOnly:一种稍微不那么严格的权限样式,允许对经过身份验证的用户进行完全访问,但允许对未经身份验证的用户进行只读访问。

AllowAny:允许无限制访问。

IsAdminUser:只允许管理员用户访问。

3、自定义权限

要实现自定义权限,需要覆盖BasePermission,并实现以下任一方法或两者:

(1).has_permission(self, request, view)

(2).has_object_permission(self, request, view, obj)

(3)True表示条件通过,False表示条件不通过。

四、自定义认证与自定义权限的使用

由于drf-jwt是基于django自带的认证系统(库中的auth_user表)来实现的,我自己的库的Users表是没有username字段的,且登录验证使用字段user_no和password,所以使用pyjwt实现了令牌认证,如图,根据user_no与password生成token:

views.py中登录的token生成使用get_jwt_token方法:

生成了token之后,怎么样才能让其他接口都走这个JWT的验证机制呢?

1、自定义认证

参照官方文档:要实现自定义身份验证方案,需继承BaseAuthentication类,并使用authenticate(self, request)方法,返回user, auth。如图,新建一个myauth.py文件,这里写的比较简单,还可以加上验证token是否过期等:

配置自定义认证,我这里使用的是全局配置的方式,在settings中配置:

2、自定义权限

用户认证完成后,需要配置权限,权限决定了请求是否能够通过,要求任何经过身份验证的用户都访问,但是拒绝任何未经身份验证的用户访问。由于Users表是使用我自己创建的表,使用默认的权限('rest_framework.permissions.IsAuthenticated')会报错:not request.user.is_authenticated,所以使用自定义的权限。

新建一个myperm.py文件,写的比较简单:

配置自定义权限,我这里也是使用的是全局配置的方式,在settings中配置:

以上,就完成了一个项目最基础的验证和权限。

可以使用接口测试工具测试一下,先POST登录接口,获取JWT,在使用该用户的JWT访问其他接口,就可以获取到数据。

如果请求头中没有携带JWT或者JWT错误,是无法获取到数据的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容