基于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
相关产品推荐
相关产品推荐

