如果让有些接口/页面,必须登录才能看,那么默认权限就可以,要么有权限,要么没有权限
只需要新增 IsAuthenticated
,那么前端请求过来必须携带token(比如已经登录)进行验证,才会返回想要的数据
在接口的视图类中定义 permission_classes = [IsAuthenticated, ]
# from .models import Book
# from rest_framework.views import APIView
# from rest_framework.response import Response
# from .serializers import BookSerializer
from rest_framework.permissions import IsAuthenticated
#
# class BookView(APIView):
permission_classes = [IsAuthenticated, ] #登录认证,如果没有携带token请求会返回没有登录
#
# def get(self, request):
# book_list = Book.objects.all()
# ret = BookSerializer(book_list, many=True)
# return Response(ret.data)
需要向 127.0.0.1:8000/books/list
发送 get
请求
get请求的 header
头部 必须为 key为 Authorization
,value为 jwt ${token}
(注意,jwt后面带一个空格)
{
"Authorization": "jwt ${token}"
}
请求参数 : 如果后端需要请求参数则携带,如果不需要请求参数,则不用携带参数 发送请求
在能登录才能 访问 接口/页面的同时,还能让用户登录后,用户权限权重够不够资格看 某些特定的接口/页面
通过继承 BasePermission
类的 has_permission
方法来实现自定义权限
涉及到权限的分层,需要定义每个用户的权限等级,方便根据这个字段type,进行细分管理
user/models.py
# from django.db import models
# from django.contrib.auth.models import AbstractUser
# class User(AbstractUser):
# """用户模型类"""
# # 如果手机设置 IntegerField的话,只有10位数字,并且有正有负
# # 手机号不需要计算,所以不需要设置int类型,设置字符串即可
# mobile = models.CharField(max_length=15, unique=True, verbose_name=‘手机号‘)
# avatar = models.ImageField(upload_to="avator",null=True,blank=True,verbose_name="用户头像")
type = models.IntegerField(choices=((1,‘外包‘),(2,‘正式员工‘),(3,‘经理‘)),default=1,verbose_name="权限级别")
# class Meta:
# db_table = ‘users‘
# verbose_name = ‘用户‘
# verbose_name_plural = verbose_name
python3 manage.py makemigrations
python3 manage.py migrate
新建user/permission.py
里面定义了 type是1的级别的人,返回False,无法访问
from rest_framework.permissions import BasePermission
class MyPermission(BasePermission):
"""
自定义权限,可以让权限再次细分
message 不能改名,因为调用父类中,报异常需要通过 反射的方式调用 message
"""
message = "权限不足" #如果权限不足,定义返回异常信息的内容
def has_permission(self, request, view):
"""重写父类的方法"""
user_obj = request.user
if user_obj.type == 1: # 定义外包不能访问
return False
else: # 除了级别 type是1的外包之外的人,都能访问
return True
导入自定义权限的方法,在 permission_classes
中引入自定义的权限,进行验证
# from .models import Book
# from rest_framework.views import APIView
# from rest_framework.response import Response
# from .serializers import BookSerializer
# from rest_framework.permissions import IsAuthenticated
from user.permission import MyPermission
# class BookView(APIView):
permission_classes = [MyPermission, ] #登录认证,如果没有携带token请求会返回没有登录
#
# def get(self, request):
# book_list = Book.objects.all()
# ret = BookSerializer(book_list, many=True)
# return Response(ret.data)
当user新增type字段时,默认为1,在自定义权限控制中定义如果type为1,则不通过
所以get方法 携带头部信息的token请求 http://0.0.0.0:8000/books/list 接口,显示 刚才自定义的 message 内容"没有权限"
当这个用户的字段type修改为2的时候,则可以访问
原文:https://www.cnblogs.com/wyzerg/p/13542889.html