前后端分离djangorestframework——权限组件

时间:2023-03-09 02:08:14
前后端分离djangorestframework——权限组件

权限permissions

权限验证必须要在认证之后验证

权限组件也不用多说,读了源码你就很清楚了,跟认证组件很类似

具体的源码就不展示,自己去读吧,都在这里:

前后端分离djangorestframework——权限组件

前后端分离djangorestframework——权限组件

局部权限

设置model表,其中的type就是用户类型

前后端分离djangorestframework——权限组件

数据库:

前后端分离djangorestframework——权限组件

在根目录创建utils,utils创建permission文件,在其中定义权限类,自定义的权限类必须继承BasePermission类,且必须定义has_permission方法,其中message是权限验证没通过时显示的字段

前后端分离djangorestframework——权限组件

url:

前后端分离djangorestframework——权限组件

前后端分离djangorestframework——权限组件

view:

前后端分离djangorestframework——权限组件

开始访问,刚才说了权限是在用户登录认证之后做的处理,所以也必须带上token访问:

前后端分离djangorestframework——权限组件

好现在是无权访问,修改用户的type为1看看:

前后端分离djangorestframework——权限组件

重启项目再次访问:

前后端分离djangorestframework——权限组件

如果不带token访问:

前后端分离djangorestframework——权限组件

所以其实在定义的权限类那里可以先作判断是否用户已通过认证,这个可以自行研究

主要代码:

view:

from rest_framework.views import APIView
from rest_framework.views import Response
from utils.auth import MyAuth
from utils.permisson import MyPermission
from DRF.models import User
import uuid

class DemoView(APIView):
    def get(self, request):
        return Response('简单认证')

class LoginView(APIView):
    def get(self, request):
        return Response('请登录,如果没有账号请创建')

    def post(self, request):
        user = request.data.get('user')
        pwd = request.data.get('pwd')
        token = uuid.uuid4()
        User.objects.create(user=user, pwd=pwd, token=token)
        return Response('创建用户成功')

class TestView(APIView):
    authentication_classes = [MyAuth, ]
    permission_classes = [MyPermission, ]

    def get(self, request):
        return Response('权限等级测试,VIP用户您好,欢迎访问XX。。。')

View

permission:

from rest_framework.permissions import BasePermission

class MyPermission(BasePermission):
    message = '无权访问,您的用户等级太低,充值888元立得永久VIP特权 '

    def has_permission(self, request, view):
        user_obj = request.user
        if user_obj.type == 3:
            return False
        else:
            return True

全局权限

根据前面的认证组件,按同样的套路,全局自然就直接在配置问题里添加就完事儿了,我空出来的地方就是需要添加的权限,自然也是一个列表,跟认证组件一样的写法

前后端分离djangorestframework——权限组件

当然权限也有自带的,都在rest_framework.permissions自行研究:

前后端分离djangorestframework——权限组件

总结

  • 自定义权限必须继承DRF定义好的权限类,需要用什么就继承什么,且根据继承的类不同,必须要定义该基类里明确规定需要的方法或者属性
  • 权限验证按开发的逻辑必须要在认证组件验证之后才验证
  • 其实这些都跟认证组件差不太多,注意一下就行了,不用多说