rest-framework之权限组件

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)

执行数据库迁移命令,并添加数据:

image_thumb1

 

在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中测试:

image_thumb3

 

权限组件全局使用:

settings.py

REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.MyAuths.MyAuth",],
    # 权限组件全局使用
    "DEFAULT_PERMISSION_CLASSES":["app01.MyAuths.MyPermision",]
}

 

权限类使用顺序:

先找视图类中的权限类,再找settings里配置的权限类,最后找默认的权限类

posted @ 2020-03-18 09:43  米兰的小铁將  阅读(153)  评论(0编辑  收藏  举报