войти одним пользователем и получить доступ другого пользователя - PullRequest
0 голосов
/ 05 октября 2019

Я реализовал simpleJWT для аутентификации на основе токенов. Я создал простой тестовый API Hello World.

Во время тестирования я регистрируюсь с помощью / rest-auth / login / и для генерации use / api / token / - оба работают нормально.

Теперь для тестирования я вхожу в систему, скажем, с пользователем XYZ (обладающим правами доступа для helloworld api) и генерирую токен, используя другой пользовательский ABC (не имеющий прав доступа для helloworld api).

Итак, теперь пользователь XYZ аутентифицирован (хорошо), но у меня есть токен пользователя ABC (хорошо).

Теперь, когда я вызываю API с токеном, сгенерированным для использования ABC, я могу получить доступ к API helloworld, даже если у пользователя ABC нет прав на API !! Поскольку пользователь XYZ, у которого уже есть права, вошел в систему.

Проблема в том, что это всегда будет случай, когда несколько пользователей будут использовать сайт. Как решить? Несколько фрагментов кода также представлены ниже:

Мой файл settings.py снят

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',

    ),
}

В основном код декоратора, который аутентифицируется для пользователей, выглядит так:

def user_is_ADM(fun_c):
    @wraps(fun_c)
    def wrapped(request, *args, **kwargs):
        # 1 = ADM
        if(request.user and request.user.is_authenticated) :   <--- here is the issue
            user_data = UserProfile.objects.get(user_id = request.user.id)

           # user profile as as a user type
            u = user_data.user_type
            if  u == 1:
                return fun_c(request, *args, **kwargs)
            else:
                raise PermissionDenied
    return wrapped

что должно бытьмоя стратегия в этом случае?

EDIT Модифицировал мой декоратор следующим образом, и он работает. Кто-то, пожалуйста, прокомментируйте, если я делаю что-то не так

def user_is_ADM(fun_c):
    @wraps(fun_c)
    def wrapped(request, *args, **kwargs):
        juser = get_user(request)
        if juser.is_authenticated:
            user_jwt = JWTAuthentication().authenticate(Request(request))
            if user_jwt is not None:
                if request.user == user_jwt[0]:
                    k = user_jwt[0].userprofile.get_user_type_display()

                    if k == 'ADM':
                        return fun_c(request,*args,**kwargs)
                    else:
                        raise PermissionDenied
                else:
                    raise PermissionDenied
            else:
                raise PermissionDenied
        else:
            raise PermissionDenied
    return wrapped

1 Ответ

0 голосов
/ 05 октября 2019

ознакомьтесь с этой документацией https://www.django -rest-framework.org / api-guide / permissions / (Пользовательские разрешения)

при настройке общего разрешения (IsAuthenticated). Это действительно проверка подлинности пользователей, но не проверка их разрешений в любое время

class IsAuthenticated(BasePermission):
    """
    Allows access only to authenticated users.
    """

    def has_permission(self, request, view):
        return bool(request.user and request.user.is_authenticated)

, если базовой аутентификации администратора и пользователя недостаточно. Вы можете реализовать пользовательское разрешение

from rest_framework import permissions

class CustomerAccessPermission(permissions.BasePermission):
    """
    extracted from the documentation
    """
    message = 'Adding customers not allowed.'

    def has_permission(self, request, view):
        """
        add authentication logic and return a boolean value
        """
        # ...
        # return bool()

в представлениях

from rest_framework.views import APIView
from modulename.permissions import CustomerAccessPermission

class ExampleView(APIView):
    """
    ...
    """
    permission_classes = (CustomerAccessPermission,)

    def get(self, request, format=None):
        """
        ...
        """

Вот пример с разрешениями аутентификации django

from typing import Tuple
from rest_framework.permissions import BasePermission

class CustomPermission(BasePermission):
    """
    ...
    """
    list_permissions: Tuple[str] = (
        'modelname.view_modelname',
        'modelname.add_modelname',
        'modelname.change_modelname',
        'modelname.delete_modelname',
    )

    def has_permission(self, request, view) -> bool:
        return bool(
            request.user.has_perms(self.list_permissions)
            or
            request.user and request.user.is_staff
            or
            request.user and request.user.is_superuser
        )

сводка

Что касается синтаксиса в целом, вы не увидите никаких изменений, вы должны импортировать свое разрешение или декоратор в представление, разница заключается во времени выполнения и в способе, которым django будет оценивать разрешения

Помня, чтоДекоратор - это не более чем обобщенный способ сказать func (func ()). поэтому вы всегда должны оценивать представление и вызывать ваш метод, измененный декоратором

, вместо этого разрешения в этой структуре всегда определяются как список классов разрешений. Перед выполнением основной части представления каждое разрешение в списке проверяется. В случае неудачной проверки разрешения будут сгенерированы исключения. В доступе отказано или исключения. Будет сгенерировано неаутентифицированное исключение, и основная часть представления не будет выполнена. (Обратитесь к документации для полного объяснения)

Вы должны оценить, какой метод наиболее подходит для вашего случая (производительность, синтаксис и т. Д.).

# you can set your permission in the general settings to avoid importing into each file
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'modulename.permissions.CustomPermission',
    ),
    # ...
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...