我有一个Django Rest Framework应用程序。 身份验证通过登录方法执行:
def login(self, request):
user = find_my_user(request)
user.backend = 'django.contrib.auth.backends.ModelBackend'
login(request, user)
return Response({"status": "ok"})
身份验证有效。
我有一个具有list_route()的ViewSet,需要使用经过身份验证的用户。 这是代码:
class CommonView(viewsets.ViewSet):
@list_route()
@authentication_classes(SessionAuthentication)
@permission_classes(IsAuthenticated)
def connected(self, request):
return Response({"status": "ok"})
即使用户未经过身份验证(没有会话cookie),也会执行操作。
作为一种解决方法,我已经这样做了:
class CommonView(viewsets.ViewSet):
@list_route()
def connected(self, request):
if request.user.is_authenticated():
return Response({"status": "ok"})
else:
return Response({"status": "ko", "message": "Unauthenticated"})
但我觉得它可能更干净,任何想法?
答案 0 :(得分:0)
您可以创建一个继承自ListRouteIsAuthenticated
类的自定义BasePermission
权限类,该类将拒绝对list
路由中任何请求的未经身份验证的用户授予任何权限。
对于detail
路由请求,无论请求是经过身份验证还是未经身份验证,都将允许不受限制的访问。
from rest_framework.permissions import BasePermission
class ListRouteIsAuthenticated(BasePermission):
"""
Custom Permission Class which authenticates a request for `list` route
"""
def has_permission(self, request, view):
if view.action == 'list':
return request.user and request.user.is_authenticated() # check user is authenticated for 'list' route requests
return True # no authentication check otherwise
然后在您的视图集中,您需要定义此权限类。
class CommonView(viewsets.ViewSet):
permission_classes = [ListRouteIsAuthenticated]
...
答案 1 :(得分:-1)
根据文档,添加一个属性:
class CommonView(viewsets.ModelViewSet):
permission_classes = [IsAuthenticated]