Как я могу заставить аутентификацию Django REST работать? - PullRequest
0 голосов
/ 30 августа 2018

У меня проблемы с пониманием, как заставить аутентификацию работать. Я настроил базовый API, и я пытаюсь заставить работать любой тип аутентификации (Базовая аутентификация для начала). Но независимо от того, что я делаю, я могу получать информацию из базы данных (используя Postman) без ввода имени пользователя или пароля. Что я делаю не так?

Вот мой класс:

class User(models.Model):
    birthdate = models.DateField()
    gender = models.CharField(
        max_length=1,
        choices=(('M', 'Male'), ('F', 'Female'), ('O', 'Other'), ('U', 'Unspecified'))
    )
    join_date = models.DateField(auto_now_add=True)
    username = models.CharField(max_length=25, unique=True)
    password = models.CharField(max_length=25,)

Вот мой взгляд:

def user_tester(request):
    permission_classes = (IsAuthenticated,)
    if request.method == 'GET':
        objs = User.objects.all()
        serializer = UserSerializer(objs, many=True)
        return JsonResponse(serializer.data, safe=False) 

Вот соответствующие настройки:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )
}

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

Пожалуйста, сообщите, что я делаю не так. У меня есть некоторый опыт работы с Django, но совсем нет опыта аутентификации или прав доступа.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Следующая строка - мертвый код:

permission_classes = (IsAuthenticated,)

Вы не создаете представление, расширяя какие-либо классы остальной структуры django. только классы, такие как APIView, имеют свойство permissions_classes, которое вы можете использовать для управления аутентификацией. То, что у вас есть, - это простое представление на основе функций, которое просто возвращает json. Вы даже не используете здесь django-rest-framework. Ваш код сериализации можно заменить на to_dict и json.dumps

Если вы хотите продолжить текущий подход, украсьте свой FBV как

@api_view(['GET'])
@permission_classes((IsAuthenticated, ))

но с DRF вам лучше с подходом CBV.

0 голосов
/ 30 августа 2018

Вместо использования: permission_classes = (IsAuthenticated,), Вы должны попробовать декоратор до определения вашего метода "user_tester", например:

from rest_framework.decorators import api_view, permission_classes

@api_view(['GET'])
@permission_classes((IsAuthenticated, ))
def user_tester(request):
    objs = User.objects.all()
    serializer = UserSerializer(objs, many=True)
    return JsonResponse(serializer.data, safe=False)    
...