2015-07-14 2 views
1

У меня есть приложение Django Rest Framework. аутентификация выполняется с помощью метода авторизации:Как ограничить просмотр аутентифицированного пользователя в 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"}) 

Authentication работает плавник.

У меня есть ViewSet, имеющий list_route(), которому нужен аутентифицированный пользователь, который будет использоваться. Вот код:

class CommonView(viewsets.ViewSet): 
    @list_route() 
    @authentication_classes(SessionAuthentication) 
    @permission_classes(IsAuthenticated) 
    def connected(self, request): 
     return Response({"status": "ok"}) 

Даже если пользователь не прошел проверку подлинности (нет куки сессии), действие выполняется.

В работе вокруг, я выполнил это так:

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"}) 

Но я чувствую, что это может быть чище, какие-либо идеи?

ответ

-1

Согласно документации, добавить атрибут:

class CommonView(viewsets.ModelViewSet): 

    permission_classes = [IsAuthenticated] 
+1

Действительно, однако он будет применяться ко всем методам внутри представления. Мне просто нужно применить его к некоторым из них, – Blusky

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] 
    ... 
Смежные вопросы