Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
contraseñas login y bases de datos postgresql
#1
Buenas:

Como dice el título estoy teniendo problemas a la hora de crear una pequeña aplicación de login basada en base de datos.

En principio todo funciona correctamente siempre y cuando indiques la contraseña correcta, pero si te equivocas y tratas de rectificar el resultado es que siempre aparece el mensaje de contraseña no válida como si fuera un bucle a pesar de que la contraseña que estás introduciendo de nuevo corrigiendo la anterior sí es correcta. (No sé si me explico bien). ¿Puede que necesite hacer una "reconexión a la base de datos en la sentecia elif?.

Como una imagen vale mil palabras os pongo el código que estoy usando. Esta es la función que se conecta a la base de datos y comprueba que la contraseña es correcta).

Código:
def abrisapp():

# PARAMETERS CONNECTION

psql_HOST = "127.0.0.1"
psql_PORT = "5432"
psql_USER = "postgres"
psql_PASS = "2208"
psql_DB = "cronas"

usur = self.comusu.get()
valid = self.enusu.get()
CAT = self.comusu.get()
query = "SELECT passwor FROM claves WHERE usuario="+"'" + usur + "'" + ";"

try:
connstr = "host=%s port=%s user=%s password=%s dbname=%s" % (psql_HOST, psql_PORT, psql_USER, psql_PASS, psql_DB)
conn = psycopg2.connect(connstr)
cur = conn.cursor()
cur.execute(query)
row = cur.fetchall()
conn.commit()
cur.close()
conn.close()

def printpasswor():

self.usuval.insert(0, row)

if self.usuval.get() == valid:

#CAT = self.comusu.get()

self.prinapp = Tk()
self.prinapp.title("CENTRO DE CONTROL DE DATOS")
self.prinapp.geometry('1680x1050')
self.prinapp.resizable(False, False)
self.prinapp.protocol("WM_DELETE_WINDOW", nocerrprinapp)


# FRAMES PRINAPP

self.frameprinapp1 = ttk.Frame(self.prinapp, style="Frames.TFrame")
self.frameprinapp1.grid(row=0, column=0)

self.frameprinapp2 = ttk.Frame(self.prinapp, style="Frames.TFrame")
self.frameprinapp2.grid(row=1, column=0)

# LABELS PRINAPP

self.labprinappcat = ttk.Label(self.frameprinapp1, text='C.A.T', font=('Gentium', 12, 'bold'), relief='groove', borderwidth=5, background='light green')
self.labprinappcat.grid(row=0, column=0, pady=3)

self.labprinappCAT = ttk.Label(self.frameprinapp1, text=CAT, font=('Gentium', 20, 'bold'), relief='sunken', background='#EAFF92', borderwidth=2, foreground='dark blue')
self.labprinappCAT.grid(row=1, column=0, padx=5)


# MENU PRINAPP

self.menubar = Menu(self.prinapp, tearoff = False, font=('Gentium', 10, 'bold'), relief='ridge', activebackground='light green')
self.menuprinapp = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp1 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp2 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp3 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuabci = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuabci1 = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuabci2 = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')

self.menuprinapp.add_cascade(label='Centro Control Logístico', menu=self.menuabci)
self.menuprinapp.add_cascade(label='Centro Control Geográfico', menu=self.menuabci1)
self.menuprinapp1.add_command(label='Ir a ...')

self.menuabci.add_command(label= 'Abrir', command=abreCCL, state='disabled')
self.menuabci.add_command(label= 'Cerrar', command=cierraCCL)

self.menuabci1.add_command(label= 'Abrir')
self.menuabci1.add_command(label= 'Cerrar')


self.menuprinapp.add_separator()
self.menuprinapp.add_command(label= "Salir de Aplicación", command=quitapp)

self.menubar.add_cascade(label = "Centros de Control", menu=self.menuprinapp)
self.menubar.add_cascade(label = "Circulares", menu=self.menuprinapp1)
self.menubar.add_cascade(label = "Procedimientos", menu=self.menuprinapp2)
self.menubar.add_cascade(label = "Manual", menu=self.menuprinapp3)

self.prinlog.destroy()
self.prinapp.configure(menu=self.menubar)
openCCL(self)

elif self.usuval.get() != valid:
messagebox.showinfo(message='La contraseña no es válida', title='ADVERTENCIA')

printpasswor()

except:
print("Error en la conexión a la base de datos")
Responder
#2
Hola. Es un poco complicado determinarlo porque no tiene indentación el código. No obstante, parece que en esta línea:

Código:
self.usuval.insert(0, row)

estás insertando la contraseña que obtenés de la base de datos en la misma caja de texto donde se supone el usuario debe escribir su contraseña, lo cual suena un poco extraño. Por otro lado, ¿de dónde viene la variable valid con la que hacés la comparación?
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
Anda leches si falta la mitad del código. A ver lo pongo entero otra vez:
Código:
class App112:



def __init__(self):



self.prinlog = Tk()

self.prinlog.title("BIENVENID@S A ...")

self.prinlog.geometry('800x600+500+200')

self.prinlog.resizable(False, False)



# ENTRY PRINAPP



self.usuval = ttk.Entry(self.prinlog)

#self.usuval.grid(row=0, column=0)



def quitapp():

try:

self.prinapp.destroy()

self.rootccl.destroy()



except TclError:

pass



def abreCCL():



self.menuabci.entryconfigure("Abrir", state='disabled')

self.menuabci.entryconfigure("Cerrar", state='normal')

openCCL(self)





def cierraCCL():

try:

self.rootccl.destroy()

self.menuabci.entryconfigure("Abrir", state='normal')

self.menuabci.entryconfigure("Cerrar", state='disabled')



except TclError:

pass



except AttributeError:

pass



# FUNTIONS LOGIN



def salirlog():

self.prinlog.destroy()



def nocerrprinlog():

pass



def abrisapp():



def nocerrprinapp():

pass



# PARAMETERS CONNECTION



psql_HOST = "127.0.0.1"

psql_PORT = "5432"

psql_USER = "postgres"

psql_PASS = "2208"

psql_DB = "cronas"



usur = self.comusu.get()

valid = self.enusu.get()

CAT = self.comusu.get()

query = "SELECT passwor FROM claves WHERE usuario="+"'" + usur + "'" + ";"



try:

connstr = "host=%s port=%s user=%s password=%s dbname=%s" % (psql_HOST, psql_PORT, psql_USER, psql_PASS, psql_DB)

conn = psycopg2.connect(connstr)

cur = conn.cursor()

cur.execute(query)

row = cur.fetchall()

conn.commit()

cur.close()

conn.close()



def printpasswor():



self.usuval.insert(0, row)



if self.usuval.get() == valid:



#CAT = self.comusu.get()



self.prinapp = Tk()

self.prinapp.title("CENTRO DE CONTROL DE DATOS")

self.prinapp.geometry('1680x1050')

self.prinapp.resizable(False, False)

self.prinapp.protocol("WM_DELETE_WINDOW", nocerrprinapp)





# FRAMES PRINAPP



self.frameprinapp1 = ttk.Frame(self.prinapp, style="Frames.TFrame")

self.frameprinapp1.grid(row=0, column=0)



self.frameprinapp2 = ttk.Frame(self.prinapp, style="Frames.TFrame")

self.frameprinapp2.grid(row=1, column=0)



# LABELS PRINAPP



self.labprinappcat = ttk.Label(self.frameprinapp1, text='C.A.T', font=('Gentium', 12, 'bold'), relief='groove', borderwidth=5, background='light green')

self.labprinappcat.grid(row=0, column=0, pady=3)



self.labprinappCAT = ttk.Label(self.frameprinapp1, text=CAT, font=('Gentium', 20, 'bold'), relief='sunken', background='#EAFF92', borderwidth=2, foreground='dark blue')

self.labprinappCAT.grid(row=1, column=0, padx=5)





# MENU PRINAPP



self.menubar = Menu(self.prinapp, tearoff = False, font=('Gentium', 10, 'bold'), relief='ridge', activebackground='light green')

self.menuprinapp = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')

self.menuprinapp1 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')

self.menuprinapp2 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')

self.menuprinapp3 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')

self.menuabci = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')

self.menuabci1 = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')

self.menuabci2 = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')



self.menuprinapp.add_cascade(label='Centro Control Logístico', menu=self.menuabci)

self.menuprinapp.add_cascade(label='Centro Control Geográfico', menu=self.menuabci1)

self.menuprinapp1.add_command(label='Ir a ...')



self.menuabci.add_command(label= 'Abrir', command=abreCCL, state='disabled')

self.menuabci.add_command(label= 'Cerrar', command=cierraCCL)



self.menuabci1.add_command(label= 'Abrir')

self.menuabci1.add_command(label= 'Cerrar')





self.menuprinapp.add_separator()

self.menuprinapp.add_command(label= "Salir de Aplicación", command=quitapp)



self.menubar.add_cascade(label = "Centros de Control", menu=self.menuprinapp)

self.menubar.add_cascade(label = "Circulares", menu=self.menuprinapp1)

self.menubar.add_cascade(label = "Procedimientos", menu=self.menuprinapp2)

self.menubar.add_cascade(label = "Manual", menu=self.menuprinapp3)



self.prinlog.destroy()

self.prinapp.configure(menu=self.menubar)

openCCL(self)



elif self.usuval.get() != valid:

messagebox.showinfo(message='La contraseña no es válida', title='ADVERTENCIA')



printpasswor()



except:

print("Error en la conexión a la base de datos")



# STYLES



# STYLE BUTTONS



self.stylebutacep = ttk.Style()

self.stylebutacep.configure("Butacep.TButton", relief = 'raised', borderwidth = 5, background ='dark green', foreground='white', font=('Ubuntu', 12, 'bold'))



self.stylebutcance = ttk.Style()

self.stylebutcance.configure("Butcance.TButton", relief = 'raised', borderwidth = 5, background ='red4', foreground='white', font=('Ubuntu', 12, 'bold'))



# STYLE COMBOBOX



self.bigfont = tkfont.Font(family="Ubuntu",size=14)

self.prinlog.option_add("*TCombobox*Listbox*Font", self.bigfont)



# STYLE CHECKBUTTONS



self.styleradio = ttk.Style()

self.styleradio.configure("Butrad.TCheckbutton", font=("Ubuntu", 12, 'bold'), relief='raised', borderwidth=2, foreground='dark blue')



# STYLE FRAMES



self.styleframe = ttk.Style()

self.styleframe.configure("Frames.TFrame", relief='ridge', borderwidth=5)



# LISTS LOGIN



self.usurlist = ["CJFP", "CEPC", "CMMR", "CMJD", "CBLD"]







# LOGIN FRAME



self.frameprinlog = ttk.Frame(self.prinlog, width=800, height=600)

self.frameprinlog.grid(row=0, column=0)



self.canvas1 = Canvas(self.frameprinlog, width=800, height=600, background='black')

self.canvas1.grid(row=0, column=0, sticky=N+S+E+W)



self.peregrino = PhotoImage(file="/home/juan/Downloads/Peregrino.gif")



self.canvas1.create_image(400,300, image=self.peregrino, anchor='center')



self.framelogin_can= ttk.Frame(self.canvas1, style="Frames.TFrame")



self.canvas1.create_window(0,0, window=self.framelogin_can, anchor='nw')



self.comusu = ttk.Combobox(self.framelogin_can, width=5, font=('Ubuntu', 14))

self.comusu.grid(row=2, column=0, pady=5)

self.comusu["values"]= self.usurlist





self.eti1usu = ttk.Label(self.framelogin_can, text='USUARIO', background='light green', relief='ridge', borderwidth=2, font=('Gentium',14, 'bold'))

self.eti1usu.grid(row=1, column=0, pady=5)



self.eti2usu = ttk.Label(self.framelogin_can, text='CONTRASEÑA', background='light green', relief='ridge', borderwidth=2, font=('Gentium',14, 'bold'))

self.eti2usu.grid(row=3, column=0, pady=5, padx=5)



self.enusu = ttk.Entry(self.framelogin_can, width=10, font=('Ubuntu', 14, 'bold'), show='*')

self.enusu.grid(row=4, column=0, pady=5)



self.butusu = ttk.Button(self.framelogin_can, text='ACEPTAR', style ="Butacep.TButton", command=abrisapp)

self.butusu.grid(row=9, column=0, pady=5)



self.but1usu = ttk.Button(self.framelogin_can, text='CANCELAR', style = "Butcance.TButton", command=salirlog)

self.but1usu.grid(row=10, column=0, pady=5)



self.etiusu = ttk.Label(self.framelogin_can, text='LOGIN', font=('Ubuntu', 26, 'bold'), background='light blue', relief='ridge', borderwidth=5)

self.etiusu.grid(row=0, column=0, padx=10, pady=10)



self.prinlog.protocol("WM_DELETE_WINDOW", nocerrprinlog)



self.prinlog.mainloop()











def main():

my_app = App112()



if __name__ == '__main__':

main()


Vale, tengo un entry "virtual" (self.usuval) es decir está en la aplicación pero no está representado gráficamente porque no tiene .grid().



Hago esto porque por alguna razón que no entiendo, cuando intento obtener el campo de la contraseña de la base de datos me da error. Lo que hago es que dentro de ese entry "virtual", introduzco la contraseña obtenida del SELECT de la base de datos y desde ahí ya no me da ningún error y parece que detecta la contraseña correctamente. (Puede que sea toda esa vuelta la que me esté dando problemas, creo que tengo la solución pero aún no he podido probarlo. Sería el usar el comando cur.fetchone() en vez de el cur.fetchall() ya que este último me crea una lista y puede que sea eso lo que me esté dando el problema).



Bien, como digo todo funciona perfectamente si desde el principio introduces la contraseña correcta la app se abre sin problemas y todo funciona perfectamente. Si por alguna razón introduces la contraseña incorrecta también funciona correctamente y aparece el mensaje 'la contraseña no es válida'. Y aquí comienza el problema:



Si borras la contraseña incorrecta e intentas poner otra, por mucho que introduzcas la contraseña correcta siempre vuelve a aparecer el mensaje" 'la contraseña no es válida'. Es decir es como si ya no detectase el SELECT de la base de datos que introduje en el entry virtual.

Esto es por el problema de que el usuario pueda equivocarse al introducir la contraseña y quiero solucionarlo para que si la borre e introduzca la correcta le de acceso a la app.



Siento lo de la identación pero en teoría la misma es correcta ya que no me arroja ningún error.
Responder
#4
Efectivamente todo ese rodeo te está dando problemas. Simplemente guarda la contraseña de la base de datos así:

Código:
password = cursor.fetchone()[0]

Y luego compara el texto ingresado por el usuario con esa variable.
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#5
(07-09-2019, 07:23 PM)Francisco escribió: Efectivamente todo ese rodeo te está dando problemas. Simplemente guarda la contraseña de la base de datos así:

Código:
password = cursor.fetchone()[0]

Y luego compara el texto ingresado por el usuario con esa variable.


Confirmado el problema era el entry "virtual" y el fetchall().



Ya funciona todo correctamente. (No lo he hecho exactamente como tú pero el resultado es óptimo).



Pongo aquí el ejemplo de como funciona todo correctamente por si alguien tiene el mismo problema. (Suponiendo que use postgresql y la identación correspondiente).



Código:
# PARAMETERS CONNECTION



psql_HOST = "127.0.0.1"

psql_PORT = "5432"

psql_USER = "postgres"

psql_PASS = "2208"

psql_DB = "cronas"

           

usur = self.comusu.get()

passw = self.enusu.get()

CAT = self.comusu.get()

query = "SELECT passwor FROM claves WHERE usuario="+"'" + usur + "'" + ";"



try:

connstr = "host=%s port=%s user=%s password=%s dbname=%s" % (psql_HOST, psql_PORT, psql_USER, psql_PASS, psql_DB)

conn = psycopg2.connect(connstr)

cur = conn.cursor()

cur.execute(query)

row = cur.fetchone()[0]

conn.commit()

cur.close()

conn.close()



def printpasswor():



if row == passw:



self.prinapp = Tk()

self.prinapp.title("CENTRO DE CONTROL DE DATOS")

self.prinapp.geometry('1680x1050')

self.prinapp.resizable(False, False)

self.prinapp.protocol("WM_DELETE_WINDOW", nocerrprinapp)





# FRAMES PRINAPP



self.frameprinapp1 = ttk.Frame(self.prinapp, style="Frames.TFrame")

self.frameprinapp1.grid(row=0, column=0)



self.frameprinapp2 = ttk.Frame(self.prinapp, style="Frames.TFrame")

self.frameprinapp2.grid(row=1, column=0)



# LABELS PRINAPP



self.labprinappcat = ttk.Label(self.frameprinapp1, text='C.A.T', font=('Gentium', 12, 'bold'), relief='groove', borderwidth=5, background='light green')

self.labprinappcat.grid(row=0, column=0, pady=3)



self.labprinappCAT = ttk.Label(self.frameprinapp1, text=CAT, font=('Gentium', 20, 'bold'), relief='sunken', background='#EAFF92', borderwidth=2, foreground='dark blue')

self.labprinappCAT.grid(row=1, column=0, padx=5)





# MENU PRINAPP



self.menubar = Menu(self.prinapp, tearoff = False, font=('Gentium', 10, 'bold'), relief='ridge', activebackground='light green')

self.menuprinapp = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')

self.menuprinapp1 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')

self.menuprinapp2 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')

self.menuprinapp3 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')

self.menuabci = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')

self.menuabci1 = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')

self.menuabci2 = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')



self.menuprinapp.add_cascade(label='Centro Control Logístico', menu=self.menuabci)

self.menuprinapp.add_cascade(label='Centro Control Geográfico', menu=self.menuabci1)

self.menuprinapp1.add_command(label='Ir a ...')



self.menuabci.add_command(label= 'Abrir', command=abreCCL, state='disabled')

self.menuabci.add_command(label= 'Cerrar', command=cierraCCL)



self.menuabci1.add_command(label= 'Abrir')

self.menuabci1.add_command(label= 'Cerrar')





self.menuprinapp.add_separator()

self.menuprinapp.add_command(label= "Salir de Aplicación", command=quitapp)



self.menubar.add_cascade(label = "Centros de Control", menu=self.menuprinapp)

self.menubar.add_cascade(label = "Circulares", menu=self.menuprinapp1)

self.menubar.add_cascade(label = "Procedimientos", menu=self.menuprinapp2)

self.menubar.add_cascade(label = "Manual", menu=self.menuprinapp3)



self.prinlog.destroy()

self.prinapp.configure(menu=self.menubar)

openCCL(self)



else:

messagebox.showinfo(message='La contraseña no es válida', title='ADVERTENCIA')



printpasswor()



except:

print("Error en la conexión a la base de datos")



MUCHAS GRACIAS
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)