You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Django Rest Framework的自定义对象级权限类开发问询

Django自定义权限类:基于UserProfile权限与对象所有者控制访问

你已经有了一个不错的基础,我来帮你完善这个权限类,确保它能精准实现你想要的逻辑——允许拥有ad_ac权限的用户执行创建/更新操作,否则仅允许对象所有者进行操作。

首先,我们需要考虑两种场景:创建操作(此时对象还不存在)和更新/删除等对象级操作,所以需要同时实现has_permission(视图级权限)和has_object_permission(对象级权限)两个方法:

from rest_framework import permissions

class OwnerAdPermission(permissions.BasePermission):
    """对象级权限:允许拥有ad_ac权限的用户执行创建/更新操作,否则仅允许对象所有者操作"""

    def has_permission(self, request, view):
        # 安全方法(GET、HEAD、OPTIONS)默认允许访问,可根据需求调整
        if request.method in permissions.SAFE_METHODS:
            return True
        
        # 处理创建操作(POST):
        # - 拥有ad_ac权限的用户可创建任意对象
        # - 普通用户可创建自己的对象(创建后默认成为所有者)
        if request.method == 'POST':
            # 避免用户无UserProfile时抛出异常,用getattr做安全判断
            has_ad_perm = getattr(request.user, 'user_profile', None) and request.user.user_profile.ad_ac
            return has_ad_perm or True
        
        # 非安全方法(PUT/PATCH/DELETE)交给对象级权限处理
        return True

    def has_object_permission(self, request, view, obj):
        # 安全方法默认允许访问
        if request.method in permissions.SAFE_METHODS:
            return True
        
        # 拥有ad_ac权限的用户,允许所有修改操作
        has_ad_perm = getattr(request.user, 'user_profile', None) and request.user.user_profile.ad_ac
        if has_ad_perm:
            return True
        
        # 普通用户仅允许操作自己拥有的对象
        return obj.owner == request.user

关键细节说明:

  • 视图级权限(has_permission):针对创建操作(POST),我们允许普通用户创建自己的对象(毕竟创建后他们就是所有者),而拥有ad_ac权限的用户可以创建任意对象。
  • 对象级权限(has_object_permission):对于更新、删除等操作,先检查用户是否有ad_ac权限,有则直接放行;否则验证是否是对象的所有者。
  • 安全判断:用getattr(request.user, 'user_profile', None)避免部分用户未创建UserProfile时抛出DoesNotExist异常,让代码更健壮。
  • 搭配认证:这个权限类需要和IsAuthenticated一起使用,确保只有登录用户才能访问,比如在视图中设置:
    permission_classes = [permissions.IsAuthenticated, OwnerAdPermission]
    

内容的提问来源于stack exchange,提问作者Babak Abadkheir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:25:23