认证:判断用户是否登陆,从而获取用户的信息
权限:判断当前用户是否有权限访问API接口,例如:普通用户,管理员,超级管理员权限可能是不同的
下面通过案例进行介绍
模型类
from django.db import models class UserInfo(models.Model): role_choices = ((1, "普通用户"), (2, "管理员"), (3, "超级管理员"),) role = models.IntegerField(verbose_name="角色", choices=role_choices, default=1) username = models.CharField(verbose_name="用户名", max_length=32) password = models.CharField(verbose_name="密码", max_length=64) token = models.CharField(verbose_name="TOKEN", max_length=64, null=True, blank=True)
权限类
from rest_framework.permissions import BasePermission class MyPermission(BasePermission): message = {'code': 1000, 'data': '无权访问'} def has_permission(self, request, view): if request.user.role == 2: return True return False def has_object_permission(self, request, view, obj): return True
在自定义的权限类中继承BasePermission
-
has_permission:定义权限判断逻辑
-
has_object_permission:检查某个用户是否对数据库中数据是否有操作权限
-
RetrieveModelMixin
-
UpdateModelMixin
-
DestroyModelMixin
-
-
message:在权限不同过时返回个前端数据
订单视图类
class OrderView(APIView): permission_classes = [MyPermission, ] def get(self, request, *args, **kwargs): print(request.user) print(request.auth) return Response({ 'code': 0, 'data': '订单数据' })
-
在视图类中设置类变量
permission_classes
的值为 认证类MyPermission
,表示此视图在执行内部功能之前需要先经过权限校验。 -
权限类是可以使用多个的,从上面中列表就可以知道
关于多个权限类
在开发中需要对用户进行多个权限的校验(都必须通过),可以使用多个权限类
当我们使用了多个权限类时,会按照列表顺序,逐个执行权限类的has_permission
方法,如果返回True则执行下一个权限类,如果返回None或者False,则抛出权限异常并停止权限校验
全局配置
REST_FRAMEWORK = { "DEFAULT_PERMISSION_CLASSES":["xxxx.xxxx.xx.类名","xxxx.xxxx.xx.类名",] }
底层源码实现
关于has_permission的返回值
-
返回True:执行下一个权限验证类
-
返回None或者False,抛出权限验证失败的异常