Foros del Web » Programando para Internet » Python »

Un mensaje diferente por cada fallo de autenticación

Estas en el tema de Un mensaje diferente por cada fallo de autenticación en el foro de Python en Foros del Web. No supe qué otro título poner... Tengo este código para autenticarme en un servidor LDAP: Código PHP: # -*- coding: cp1252 -*- from Tkinter import  * ventana  =  Tk () #Empieza: Cubrir la pantalla completa ...
  #1 (permalink)  
Antiguo 21/09/2011, 16:59
Avatar de saulortega  
Fecha de Ingreso: septiembre-2011
Ubicación: Bogotá
Mensajes: 79
Antigüedad: 10 años, 9 meses
Puntos: 0
Un mensaje diferente por cada fallo de autenticación

No supe qué otro título poner...

Tengo este código para autenticarme en un servidor LDAP:

Código PHP:
# -*- coding: cp1252 -*-

from Tkinter import *

ventana Tk()

#Empieza: Cubrir la pantalla completa
wventana.winfo_screenwidth(), ventana.winfo_screenheight()
ventana.overrideredirect(1)
ventana.geometry("%dx%d+0+0" % (wh))
#Termina: Cubrir la pantalla completa


#Empieza: Solicitar usuario y contraseña
label_usuarioinicial Label(ventanatext="Documento de identidad:")
usuarioinicial Entry(ventana)
label_claveinicial Label(ventanatext="Contraseña:")
claveinicial Entry(ventanashow="*")
     
label_usuarioinicial.pack()
usuarioinicial.pack()
label_claveinicial.pack()
claveinicial.pack()
     
usuarioinicial.focus_set()
#Termina: Solicitar usuario y contraseña


#Empieza: Conexión y autenticación LDAP
def autenticar():
    
import ldap
    
try:
        
l=ldap.initialize("ldap://12.34.56.78:389"#Realizar la conexión
        
l.protocol_version ldap.VERSION3 #Versión a utilizar
        
usuario="cn="+usuarioinicial.get()+",ou=Users,dc=dominio,dc=co"
        
clave=claveinicial.get()
        
l.simple_bind_s(usuarioclave#Validar usuario
        
print "¡CONECTADO!"
        
ventana.destroy() #Cerrar la ventana de bloqueo si la autenticación es correcta
        
l.unbind_s() #Cerrar la conexión
    
except ldap.INVALID_CREDENTIALS#Mostrar mensaje si no es válida la autenticación
        
print "Usuario o contraseña no válidos."
        
incorrecto Label(ventanawidth=60justify=LEFTwraplength=400text="\nEl documento de identidad o la contraseña no son correctos.")
        
incorrecto.pack()
    
except ldap.INVALID_DN_SYNTAX:
        print 
"Sintaxis incorrecta"
        
sintaxis Label(ventanawidth=60justify=LEFTwraplength=400text="\nCometió un error al escribir el documento de identidad. Por favor corríjalo.")
        
sintaxis.pack()
    
except ldap.LDAPErrore:
        print 
"Error desconocido: ",e
        otroerror 
Label(ventanawidth=60justify=LEFTwraplength=400text="\nHa ocurrido un problema de conexión.")
        
otroerror.pack()
#Termina: Conexión y autenticación LDAP


#Empieza: Definir botón y acción a realizar al pulsarlo
b1 Button(ventanatext="Iniciar"width=10command=autenticar)
b1.pack()
#Termina: Definir botón y acción a realizar al pulsarlo


ventana.mainloop() 
Cada vez que la autenticación es errónea, aparece el mensaje "El documento de identidad o la contraseña no son correctos." ¿Cómo hago para que en la segunda autenticación errónea aparezca un mensaje diferente?

Intenté jugar con variables que iban aumentando y con "if", pero no me funcionó...
  #2 (permalink)  
Antiguo 21/09/2011, 17:13
Avatar de Hazuki  
Fecha de Ingreso: mayo-2011
Mensajes: 34
Antigüedad: 11 años, 1 mes
Puntos: 7
Respuesta: Un mensaje diferente por cada fallo de autenticación

Tal vez podrías almacenar los mensajes en una lista, y la cantidad de intentos en una variable, luego hacer algo como esto, suponiendo que "mensajes" sea la lista con los posibles mensajes, e "intentos" el número de intentos realizados:

Código:
if intentos<len(mensajes): # Si el nº de intento actual es menor al número de mensajes
	print mensajes[intentos]
	intentos += 1
else: # Si el nº de intento es mayor al número de mensajes
	print mensajes[-1]
Al primero intento muestra el primer mensaje, al segundo intento el segundo mensaje... y así hasta que haya más intentos que mensajes, en cuyo caso se muestra el último mensaje.

Espero que te sirva como referencia.
Un saludo.
  #3 (permalink)  
Antiguo 21/09/2011, 18:15
Avatar de saulortega  
Fecha de Ingreso: septiembre-2011
Ubicación: Bogotá
Mensajes: 79
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Un mensaje diferente por cada fallo de autenticación

La cuestión es precisamente cómo hacer que la variable vaya aumentando en cada intento.

Verás, al pulsar el botón "Iniciar" se ejecuta la función "autenticar". Así que si pongo una variable dentro de "autenticar", esta va a comenzar desde el inicio en cada intento, pues la función se ejecuta desde el principio en cada intento.

Ahora, si pongo la variable por fuera de la función, y dentro de la función el aumento de dicha variable, no funciona porque no reconoce la variable que está por fuera de la función "autenticar". Es como si no existiera la variable.

Lo que se me está ocurriendo en este momento, es realizar más de una acción al pulsar "Iniciar", pero no sé si eso se puede hacer... No sé si se puede definir otra acción a realizar en "command".
  #4 (permalink)  
Antiguo 21/09/2011, 18:39
Avatar de saulortega  
Fecha de Ingreso: septiembre-2011
Ubicación: Bogotá
Mensajes: 79
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Un mensaje diferente por cada fallo de autenticación

Bueno, encontré una manera de hacerlo, pero creo que es un poco rebuscada.

Código PHP:
    except ldap.INVALID_CREDENTIALS#Mostrar mensaje si no es válida la autenticación
        
print "Usuario o contraseña no válidos."
        
b1.destroy() #Destruye el botón actual
        
b2 Button(ventanatext="Iniciar"width=10command=autenticar2#Crea unnuevo botón que llama a otra función idéntica a esta, pero con otro mensaje
        
b2.pack()
        
incorrecto Label(ventanawidth=60justify=LEFTwraplength=400text="\nEl documento de identidad o la contraseña no son correctos."#Muestro el primer mensaje de error
        
incorrecto.pack() 
  #5 (permalink)  
Antiguo 21/09/2011, 18:45
Avatar de Hazuki  
Fecha de Ingreso: mayo-2011
Mensajes: 34
Antigüedad: 11 años, 1 mes
Puntos: 7
Respuesta: Un mensaje diferente por cada fallo de autenticación

También puedes declarar la variable fuera de la función, como dijiste, y al entrar en la función escribir:
Código:
global intentos #Suponiendo que 'intentos' sea el nombre de la variable
De este modo al utilizar la variable intentos se utiliza la global (es decir, la que está fuera de la función).
  #6 (permalink)  
Antiguo 21/09/2011, 18:45
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 17 años, 3 meses
Puntos: 1360
Respuesta: Un mensaje diferente por cada fallo de autenticación

No es un código muy difícil.

Ejemplo generico:
Código Python:
Ver original
  1. intentos = 5
  2. ... #Mucho codigo despues
  3. if usuario == usuario and password == password:
  4.     login()
  5. elif intentos <= 0:
  6.     salir()
  7. else:
  8.     intentos -= 1

Ejemplo aplicado a tu programa
Código Python:
Ver original
  1. # -*- coding: cp1252 -*-
  2.  
  3. from Tkinter import *
  4.  
  5. ventana = Tk()
  6.  
  7.  
  8. w, h = ventana.winfo_screenwidth(), ventana.winfo_screenheight()
  9. ventana.overrideredirect(1)
  10. ventana.geometry("%dx%d+0+0" % (w, h))
  11.  
  12. label_usuarioinicial = Label(ventana, text="Documento de identidad:")
  13. usuarioinicial = Entry(ventana)
  14. label_claveinicial = Label(ventana, text="Contraseña:")
  15. claveinicial = Entry(ventana, show="*")
  16. incorrecto = Label(ventana, width=60, justify=LEFT, wraplength=400, text="")
  17.  
  18.  
  19. label_usuarioinicial.pack()
  20. usuarioinicial.pack()
  21. label_claveinicial.pack()
  22. claveinicial.pack()
  23.      
  24. usuarioinicial.focus_set()
  25. intentos = 5
  26.  
  27.  
  28.  
  29. def autenticar():
  30.     global intentos
  31.     usr = usuarioinicial.get()
  32.     passwd = claveinicial.get()
  33.     if usr == "usuario" and passwd == "secreto":
  34.         incorrecto.config(text="Login correcto")
  35.     elif intentos <= 0:
  36.         incorrecto.config(text="Login incorrecto, sin intentos")
  37.     else:
  38.         intentos -= 1
  39.         incorrecto.config(text="Le que dan %d intentos" % intentos)
  40.        
  41. b1 = Button(ventana, text="Iniciar", width=10, command=autenticar)
  42. b1.pack()
  43.  
  44. incorrecto.pack()  
  45.  
  46.  
  47. ventana.mainloop()
  #7 (permalink)  
Antiguo 21/09/2011, 19:32
Avatar de saulortega  
Fecha de Ingreso: septiembre-2011
Ubicación: Bogotá
Mensajes: 79
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Un mensaje diferente por cada fallo de autenticación

¡Eso era! "global"

Gracias a los dos.

Soy muy novato.

Etiquetas: autenticación
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:00.