前后端分离djangorestframework——权限组件
权限permissions
权限验证必须要在认证之后验证
权限组件也不用多说,读了源码你就很清楚了,跟认证组件很类似
具体的源码就不展示,自己去读吧,都在这里:
局部权限
设置model表,其中的type就是用户类型
数据库:
在根目录创建utils,utils创建permission文件,在其中定义权限类,自定义的权限类必须继承BasePermission类,且必须定义has_permission方法,其中message是权限验证没通过时显示的字段
url:
view:
开始访问,刚才说了权限是在用户登录认证之后做的处理,所以也必须带上token访问:
好现在是无权访问,修改用户的type为1看看:
重启项目再次访问:
如果不带token访问:
所以其实在定义的权限类那里可以先作判断是否用户已通过认证,这个可以自行研究
主要代码:
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。。。')
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
全局权限
根据前面的认证组件,按同样的套路,全局自然就直接在配置问题里添加就完事儿了,我空出来的地方就是需要添加的权限,自然也是一个列表,跟认证组件一样的写法
当然权限也有自带的,都在rest_framework.permissions自行研究:
总结
- 自定义权限必须继承DRF定义好的权限类,需要用什么就继承什么,且根据继承的类不同,必须要定义该基类里明确规定需要的方法或者属性
- 权限验证按开发的逻辑必须要在认证组件验证之后才验证
- 其实这些都跟认证组件差不太多,注意一下就行了,不用多说