一、权限认证源码详解
1、进入dispatch
2、initial中self.check_permissions(request)进行权限验证
3、进入check_permissions
for permission in self.get_permissions():
4、进入get_permissions返回一个权限类的对象列表
[permission() for permission in self.permission_classes]
5、permission_classes=[xxx,]系统自带的,一般自己定义
xxx权限验证类():
message="自定义认证失败返回给用户的信息"
def has_permiddion(self,request,view):
...
6、接回第三步继续向下执行
if not permission.has_permission(request, self):
如果has_permission返回True,继续向下执行,如果一直True,什么都不做,相当于通过验证
如果has_permission返回False,则执行if里面的代码,接下来看第七步
7、进入self.permission_denied中,抛出异常,认证失败。
if request.authenticators and not request.successful_authenticator:
raise exceptions.NotAuthenticated()
raise exceptions.PermissionDenied(detail=message)
二、设置访问权限
1、全局设置访问权限:
REST_FRAMEWORK = {
"DEFAULT_PEMISSION_CLASSES":['自己编写的权限认证类的绝对路径']
}
某个不需要访问权限的类里面
permission_classes = []
2、局部设置权限:
在需要权限的类里面写
permission_classes = ['自定义的权限认证类']
三、自定义权限认证类
上面是源码里面的流程,帮助我们理解权限认证类,我们自己编写只需要
from rest_framework.permissions import BasePermission
class XXX(BasePermission):
message = "当认证失败时我们想要返回给用户的信息"
def has_permission(self,request,view): #(该方法必须有)
自定义的认证逻辑最后返回返回True或False
return False
return True
四、另外的权限验证类
除了BasePermission之外,源码中还有另外几个权限认证类
class AllowAny(BasePermission):默认是全部通过验证
class IsAuthenticated(BasePermission):基于Django的认证来判断是否通过权限
class IsAdminUser(BasePermission):基于Django的Admin判断是否通过验证
class IsAuthenticatedOrReadOnly(BasePermission):
class DjangoModelPermissions(BasePermission):
在生产环境中,我们一般不用系统自带的权限验证类,都是根据自己的需求来进行编写。