django - Django API 权限装饰器
问题描述
目标: 我想只允许具有特定权限的用户使用某些端点。
例如调用允许创建用户的端点,您需要权限“user.create”
问题:
我尝试创建一个中间件以将其与decorator_from_middleware_with_args一起使用
class PermissionMiddleware:
def __init__(self, view,permission):
self.permission = permission
def process_request(self, request):
if not request.user.has_perm(permission_name):
if raise_exception:
raise exceptions.PermissionDenied("Don't have permission")
return False
return True
然后在我的视图中,我使用decorator_from_middleware_with_args
class UtilisateurViewSet(viewsets.ViewSet):
permission = decorator_from_middleware_with_args(PermissionMiddleware)
@permission('view_utilisateur')
def list(self, request):
queryset = Utilisateur.objects.all()
serializer = UtilisateurSerializer(queryset, many=True)
return Response(serializer.data)
但是当我调用端点时出现错误:
AttributeError:“UtilisateurViewSet”对象没有属性“用户”
我认为这是因为django.contrib.sessions.middleware.SessionMiddleware尚未执行。
有没有办法定义中间件的顺序,或者其他方式来实现想要的?
解决方案
我没有找到如何做我想要的,但我确实以另一种方式实现了它。
我permission_classes
在一个类中使用并定义了所需的权限,我将为我将添加的每个视图集执行此操作。
class UtilisateurPermission(permissions.BasePermission):
def has_permission(self, request, view):
if view.action == "create":
return bool(request.user.is_authenticated and (request.user.is_superuser or request.user.has_perm("utilisateur_create")))
elif view.action == "retrieve":
return bool(request.user.is_authenticated and (request.user.is_superuser or request.user.has_perm("utilisateur_retrieve")))
elif view.action == "list":
return bool(request.user.is_authenticated and (request.user.is_superuser or request.user.has_perm("utilisateur_list")))
elif view.action == "destroy":
return bool(request.user.is_authenticated and (request.user.is_superuser or request.user.has_perm("utilisateur_destroy")))
elif view.action == "archive":
return bool(request.user.is_authenticated and (request.user.is_superuser or request.user.has_perm("utilisateur_archive")))
elif view.action in ['update', 'partial_update']:
return bool(request.user.is_authenticated and (request.user.is_superuser or request.user.has_perm("utilisateur_update")))
else:
return False
推荐阅读
- wordpress - 主页布局自动更改
- google-chrome - Progressive Web Apps - 有没有办法关闭 Chrome 显示的启动画面,或者至少控制启动画面何时消失?
- java - 如何将 maven 目标更改为图片中的 quickicon?
- python - python pandas分析数据框
- kotlin - 如何退出 Kotlinc 命令行编译器
- reactjs - 将 props 传递给 React 的无状态组件时换行
- ruby-on-rails - Rails 5 - 设计 - Heroku NoMethodError
- google-chrome - GOOGLE 错误:要从您的在线存储中选择一个项目,请登录
- firebase - 如何在不提及特定集合名称的情况下从 fire-store 文档集合数据中检索数据?
- node.js - Windows 中的节点启动错误