Voici ma méthode d'authentification utilisateur:

def user_login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)

        if user:
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect(reverse('index'))
            else:
                print('TEST')
                messages.info(request, 'Inactive user')
                return HttpResponseRedirect(reverse('index'))
        else:
            messages.error(request, 'Invalid username/password!')
        return HttpResponseRedirect(reverse('index'))
    else:
        return render(request, 'mainapp/login.html', {})

Si l'utilisateur existe et n'est pas actif, un mauvais message apparaît:

messages.error(request, 'Invalid username/password!')
return HttpResponseRedirect(reverse('index'))

Au lieu de:

print('TEST')
messages.info(request, 'Inactive user')
return HttpResponseRedirect(reverse('index'))

Je n'ai aucune idée de ce qui ne va pas ici ... Des indices?

6
jundymek 3 avril 2017 à 15:01

2 réponses

Meilleure réponse

Le backend d'authentification ModelBackend par défaut a commencé à rejeter les utilisateurs inactifs dans Django 1.10. Par conséquent, votre authenticate() appel renvoie None, et vous obtenez le message Nom d'utilisateur / mot de passe invalide! de l'instruction if / else externe.

Comme le dit Daniel, si vous utilisez la valeur par défaut ModelBackend, vous n'avez plus besoin de cocher user.is_active dans votre vue de connexion.

Si vous voulez vraiment que authenticate renvoie les utilisateurs inactifs, vous pouvez utiliser AllowAllUsersModelBackend à la place. Si vous faites cela, il est de votre responsabilité de vérifier l'indicateur is_active dans votre vue de connexion.

AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.AllowAllUsersModelBackend']
20
Alasdair 3 avril 2017 à 12:22

L'appel à authenticate vérifie déjà que l'utilisateur a défini l'indicateur is_active, et renvoie None sinon. Il n'est pas nécessaire de le vérifier séparément.

6
Daniel Roseman 3 avril 2017 à 12:13