1、权限简介
比如只用超级用户才能访问指定的数据,普通用户不能访问,所以就要有权限组件对其限制;
2、权限组件的使用
权限使用也分为局部使用、全局使用、局部禁用,使用方式和认证组件类似;
权限组件局部使用:
models.py
from django.db import models # Create your models here. class User(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=64) # 加上用户类型字段 user_type = models.IntegerField(choices=((1, "超级管理员"), (2, "普通管理员"), (3, "2b用户")), default=3) # 和User表做一对一关联 class Token(models.Model): # OneToOneField源码本质就是Foreignkey+unique约束 user = models.OneToOneField(to='User') token = models.CharField(max_length=64)
执行数据库迁移命令,并添加数据:
在app下创建一个MyAuths.py文件,写一个权限类,并继承BasePermission
from app01 import models from rest_framework.exceptions import AuthenticationFailed from rest_framework.authentication import BaseAuthentication from rest_framework.permissions import BasePermission # Create your views here. # 认证类,内容和上一节认证中的一样 class MyAuth(BaseAuthentication): ...
# 权限类 class MyPermision(BasePermission): # message是抛出的错误信息 message = '不是超级用户,查看不了' def has_permission(self, request, view):
#因为权限是在认证之后执行的,所以能取到reugest.user
if request.user.user_type == 1: return True else: return False
views.py
from app01.MyAuths import MyAuth, MyPermision # Create your views here. # 只有超级管理员才能访问该接口 class Books(APIView): # 使用上面定义的认证类MyAuth,可以写多个认证类 # authentication_classes = [MyAuth,] permission_classes = [MyPermision,] #使用权限类 def get(self, request): # request.user就是当前登录用户,可以拿到用户名,然后再做各种操作 print(request.user.name) return Response('返回了所有图书')
在postman中测试:
权限组件全局使用:
settings.py
REST_FRAMEWORK={ "DEFAULT_AUTHENTICATION_CLASSES":["app01.MyAuths.MyAuth",],
# 权限组件全局使用 "DEFAULT_PERMISSION_CLASSES":["app01.MyAuths.MyPermision",] }
权限类使用顺序:
先找视图类中的权限类,再找settings里配置的权限类,最后找默认的权限类