Django REST Framework 权限验证实战:认证与数据权限配置详解
本文详解Django REST Framework中的权限验证机制,涵盖用户登录状态校验(IsAuthenticated)与数据操作权限控制(如IsOwnerOrReadOnly)。通过配置permission_classes与authentication_classes,结合JWT或Session认证方式,实现细粒度的API访问控制,并提供完整的代码示例与执行流程解析。
Django REST Framework 权限验证概览
Django REST Framework 的权限验证实现方案
用户身份认证:登录状态校验
一、用户身份认证:登录状态校验
(1)校验用户是否已登录系统;
permission_classes = (IsAuthenticated, )
需注意,permission_classes 用于定义验证用户是否具备登录资格以及是否有权操作特定数据的规则;
权限类的组合方式目前支持逻辑与(&,即and)、逻辑或(|,即or)以及逻辑非(~,即not);
例如:permission_classes = (SecAdminPermission | AudAdminPermission,)
注意:使用元组 (SecAdminPermission | AudAdminPermission,) 或列表 [SecAdminPermission | AudAdminPermission] 均可实现权限组合;
(2)配置用户认证的具体方式;
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
注意:authentication_classes 用于指定用户登录系统的方式,例如采用 JWT 令牌认证或传统的用户名加密码方式;
具体代码如下:
from rest_framework.permissions import IsAuthenticated # 判断用户是否登录
from rest_framework_jwt.authentication import JSONWebTokenAuthentication # jwt用户认证
class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin,
mixins.DestroyModelMixin, viewsets.GenericViewSet):
"""
list:
获取用户收藏列表
retrieve:
判断某个商品是否已经收藏
create:
收藏商品
delete:
取消收藏
"""
# 权限判断:IsAuthenticated表示是否已经登录,IsOwnerOrReadOnly表示数据是不是属于当前登录用户
permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
# 用户认证:方式一:JSONWebTokenAuthentication;方式二:SessionAuthentication
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
# 定义通过哪个参数来定位实例
lookup_field = "goods_id" # 在详细页面时,搜索goods_id来确认该商品有没有被收藏,是在当前用户下进行搜索的
def get_queryset(self):
"""获取当前登录用户的收藏信息"""
return UserFav.objects.filter(user=self.request.user)
# 方法一:修改商品收藏数
# def perform_create(self, serializer):
# """修改商品收藏数"""
# instance = serializer.save()
# goods = instance.goods
# goods.fav_num += 1
# goods.save()
# 动态设置序列化类
def get_serializer_class(self):
if self.action == "list":
return UserFavDetailSerializer
elif self.action == "create":
return UserFavSerializer
return UserFavSerializer
数据操作权限:用户对该数据的操作权
二、数据操作权限:用户对该数据的操作权
(1)自定义权限验证逻辑;
前提条件:待验证的数据对象必须包含 user 字段;
from rest_framework import permissions
# 权限判断:数据是不是属于当前登录用户
class IsOwnerOrReadOnly(permissions.BasePermission):
"""
Object-level permission to only allow owners of an object to edit it.
Assumes the model instance has an `owner` attribute.
"""
def has_object_permission(self, request, view, obj):
# 1 只读
# Read permissions are allowed to any request,
# so we'll always allow GET, HEAD or OPTIONS requests.
if request.method in permissions.SAFE_METHODS: # 是不是安全的访问方法
return True
# 2 写权限
# Instance must have an attribute named `owner`.
# return (obj.publisher if obj.publisher else self.fans )== request.user
return obj.user== request.user # 判断当前数据是不是登录用户的数据
(2)在接口中集成数据权限验证逻辑;
class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin,
mixins.DestroyModelMixin, viewsets.GenericViewSet):
"""
list:
获取用户收藏列表
retrieve:
判断某个商品是否已经收藏
create:
收藏商品
delete:
取消收藏
"""
# 权限判断:IsAuthenticated表示是否已经登录,IsOwnerOrReadOnly表示数据是不是属于当前登录用户
permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
# 用户认证:方式一:JSONWebTokenAuthentication;方式二:SessionAuthentication
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
# 设置
lookup_field = "goods_id" # 在详细页面时,搜索goods_id来确认该商品有没有被收藏,是在当前用户下进行搜索的
def get_queryset(self):
"""获取当前登录用户的收藏信息"""
return UserFav.objects.filter(user=self.request.user)
补充知识:Django REST Framework API 的授权与认证机制
补充知识:Django REST Framework API 的授权与认证机制
参考 django rest framework 官方文档中的授权与认证教程
permissions.py 文件内容
from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
'''
常规的授权是 只有拥有者才能编辑它
'''
def has_object_permission(self, request, view, obj):
# 读权限 向所有请求开放
# 所以我们总是允许get, head or options requests.
if request.method in permissions.SAFE_METHODS:
return True
# 写权限 只给拥有者
return obj.owner == request.user
view.py 文件内容
'''基于泛型类的视图'''
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer, UserSerializer
from rest_framework import generics
from snippets.permissions import IsOwnerOrReadOnly
from django.contrib.auth.models import User
class UserList(generics.ListAPIView):
'''
User表的列表api视图 查 增 操作
'''
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetail(generics.RetrieveDestroyAPIView):
'''
User表的详情api视图 查 改 删操作
'''
queryset = User.objects.all()
serializer_class = UserSerializer
class SnippetList(generics.ListCreateAPIView):
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
class SnippetDetail(generics.RetrieveDestroyAPIView):
# detail 所有人都能读,但是只有拥有者可以更改
# permissions.IsAuthenticatedOrReadOnly 表示没有认证的人有读的权限,认证的人有所有权限
# IsOwnerOrReadOnly 通过了前面的授权之后,还要通过这个授权
# 当所有的授权都通过的时候 所有的对象实例都返回true 表示授权通过
permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
总结:通过传递 permission_classes 类变量来传入授权类,
1、当请求执行某个操作时 ->
2、传递参数将授权类列表中的多个授权类实例化为对象 ->
3、依次调用所有授权实例对象的 has_permission 以及 has_object_permission 方法 ->
4、所有方法的返回结果均为 true ->
5、此时该操作的授权才视为通过,数据操作继续向下执行。
以上关于 Django REST Framework 权限验证的实例分享完毕,希望能为读者提供参考,欢迎支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













