Este es mi método de autenticación de usuario:
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 el usuario existe y no está activo, aparece un mensaje incorrecto:
messages.error(request, 'Invalid username/password!') return HttpResponseRedirect(reverse('index'))en vez de:
print('TEST') messages.info(request, 'Inactive user') return HttpResponseRedirect(reverse('index'))No tengo ni idea de lo que está mal aquí... ¿Alguna pista?
El backend de autenticación ModelBackend predeterminado comenzó a rechazar usuarios inactivos en Django 1.10 . Por lo tanto, su llamada de authenticate() devuelve None , ¡y obtiene el nombre de usuario/contraseña no válido! mensaje de la instrucción if/else externa.
Como dice Daniel, si usa el ModelBackend predeterminado, ya no necesita verificar user.is_active en su vista de inicio de sesión.
Si realmente desea authenticate para devolver usuarios inactivos, puede usar AllowAllUsersModelBackend en su lugar. Si hace esto, entonces es su responsabilidad verificar el indicador is_active en su vista de inicio de sesión.
AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.AllowAllUsersModelBackend']La llamada para authenticate ya verifica que el usuario tenga el indicador is_active establecido y, de lo contrario, devuelve Ninguno. No hay necesidad de comprobarlo por separado.