权限验证代码详解及自定义权限验证类

一、权限认证源码详解
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):
在生产环境中,我们一般不用系统自带的权限验证类,都是根据自己的需求来进行编写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值