DRF关于接口权限的封装方法 2022年4月7日 1394 代码厨子 在写DRF接口时候,经常有权限验证的问题,之前没有太在意,都是在视图层进行权限控制,后来发现不符合DRF的思路,应该是自定义重写权限认证的类。 DRF的认证类之前认识不足,导致权限验证都是用最基础的方法,比如是否登录啥的,颗粒度太粗。最近在项目中遇到一些比较细节的方法,就重写了认证类,在此记录一下细节。 首先我们看一下,重写类的样式。 ```python from rest_framework import permissions class IsCompanyMasterOnlyOne(permissions.BasePermission): def has_permission(self, request, view): from app_users.models import User return False if request.user.is_master and User.objects.filter(company=request.user.company, is_master=True).count() == 1 else True def has_object_permission(self, request, view, obj): return not obj.company == request.user.company ``` 我用这个方法实现了两个场景: 1. 如果访问接口的用户是管理员并且不是唯一管理员,可以通过,反之不行 2. 访问某个对象时候,判断这个对象是否与用户归属相同公司 因此,BasePermission这个类里有两个验证,第一个是对来访用户身份进行验证,传回来的有两个参数,一个是request,一个是view,用于验证与比较。 另外一个是对某个对象访问时候验证权限,比如删除和读取操作,会多一个参数是obj,用于判断。 最终,返回布尔值来控制权限。 设计非常精妙,厉害!以后写DRF的东西,一定不能硬来,继承各种类来实现。 抖音扫码看讲解 ![](https://cdn.aqifun.com/ME/editor/WechatIMG375_20220410173200399510.jpeg)