前面的篇章,我们搭建了django的rest api服务,那么现在,我们就需要对api来做权限限制,不能让随便一个人就可以访问api接口。一般api访问的权限限制,包括basic的验证,每次的请求头中,带有username和password,access_token验证,一般是sso生成的access_token,通过token可以拿到用户的info,请求的header里面带有authorization: "Bearer access_token"。还有jwt(json web token),请求的头中带有authorization: "JWT token"。这里,我们就采用jwt,来作为用户的权限验证。

首先,我们需要安装依赖包,django-allauth,这个库还是很强大的,集成了django自带的用户验证系统,还支持各种第三方的sso用户认证,有兴趣的可以研究一下(https://github.com/pennersr/django-allauth)。可以自定义用户登陆模板页面,添加google,wechat等等的其他社交账户认证。这里我就只支持rest api认证,所以还需要安装django-rest-auth,这个就是把系统认证导出了rest接口,可以通过api认证用户。如果需要支持json web token,我们还需要djangorestframework-jwt这个库。




django 单个API取消身份认证 django api 权限_django

requirements.txt



安装好之后,需要修改settings.py文件,enable 认证相关的配置。




django 单个API取消身份认证 django api 权限_django 单个API取消身份认证_02

installed app




django 单个API取消身份认证 django api 权限_django 单个API取消身份认证_03

settings.py



接下来我们自定义了一个用户profile,可以添加更多的field,比如用户的role,来做更多的角色的限制。




django 单个API取消身份认证 django api 权限_django_04

models.py



接着我们需要修改root urls文件,注册rest-auth的路由。




django 单个API取消身份认证 django api 权限_django 单个API取消身份认证_05

urls.py



最后,我们只需要在路由具体实现里面,给viewset添加认证和权限的classes就可以了。




django 单个API取消身份认证 django api 权限_自定义_06


这里的permission_classes,我们只是简单了添加是否认证的判断,如果api有不同的角色用户的话,还可以对用户的role来做判断,进一步限制不同角色的用户对api的权限访问。

最后我们访问docs页面,去调用todos列表接口看一下。


django 单个API取消身份认证 django api 权限_django_07


我们可以看到返回401提示用户没有认证。

接着,我们来认证用户,获取token,再次调用一下。


django 单个API取消身份认证 django api 权限_django 自定义权限_08

输入用户名密码,认证


django 单个API取消身份认证 django api 权限_django 自定义权限_09

返回token信息


django 单个API取消身份认证 django api 权限_django 单个API取消身份认证_10

输入token验证


django 单个API取消身份认证 django api 权限_django_11

带有token调用api,返回200成功。


到这,我们就对自己的api做了权限的限制。谢谢大家。