Я реализовал 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