viernes, 18 de septiembre de 2015

VALIDAR USUARIO Y CONTRASEÑA EN PYTHON

Hola a todos.

Bienvenidos y muchas gracias por visitar el Blog, este espacio está construído para todo aquel que quiera incursionar al mundo de la programación en el lenguaje PYTHON y más adelante convertir todos estos ejercicio a JAVA. Si el material consultado ha sido de tu interés y ha ayudado a tu trabajo o actividad, ayudame a seguir creciendo el blog con ejercicios interesantes.


También puedes suscribirte a mi canal de Youtube: youtube.com/c/SneyderRamírez se mostrará el funcionamiento de los códigos.

NOTA: Antes de que utilices los códigos, verifica la versión PYTHON que vayas a utilizar, para no presentar problemas de compatibilidad.



EJERCICIO: VALIDAR USUARIO Y CONTRASEÑA EN PYTHON.


He encontrado un ejercicio que me ha llamado la atención en esta incursión que he hecho para este lenguaje de programación, y lo he obtenido del siguiente enlace:


El ejercicio consta de la creación de 3 módulos a los que llamé: usuario.py,  passw.py,
validador.py 

Lee todo el desarrollo del ejercicio y después descarga los 3 códigos: 
usuario.py  
passw.py  
validador.py

Adicionalmente puedes revisar otras soluciones de este ejercicio, en este mismo blog:
 2da forma: CLASES
3ra forma: Python-PyQT 
4 forma:  Recursividad ( Muy pronto)

1. MÓDULO USUARIO.(usuario)

Crear un módulo para validación de nombres de usuarios. Dicho módulo, deberá cumplir con los siguientes criterios de aceptación:
1.1 El nombre de usuario debe contener un mínimo de 6 caracteres y un máximo de 12.
1.2 El nombre de usuario debe ser alfanumérico.
1.3 Nombre de usuario con menos de 6 caracteres, retorna el mensaje "El nombre de usuario debe       contener al menos 6 caracteres".
1.4 Nombre de usuario con más de 12 caracteres, retorna el mensaje "El nombre de usuario no puede contener más de 12 caracteres".
1.5 Nombre de usuario con caracteres distintos a los alfanuméricos, retorna el mensaje "El nombre de usuario puede contener solo letras y números".
1.6 Nombre de usuario válido, retorna True.

Solución Módulo usuario.
usuario.py
def nickname(nombre_usuario):

        long=len(nombre_usuario) #Calcular la longitud del nomre de usuario
        y=nombre_usuario.isalnum() #Calcula que la cadena contenga valores alfanuméricos
        
        if y== False: # La cadena contiene valores no alfanuméricos
            print("El nombre de usuario puede contener solo letras y números")
            
        if long < 6: 
            print("El nombre de usuario debe contener al menos 6 caracteres")
            
        if long > 12: 
            print("El nombre de usuario no puede contener más de 12 caracteres")
            
        if long >5 and long <13 and y ==True:
            return True #Verdadero si el tamaño es mayor a 5 y menor a 13


2. MÓDULO PASSWORD.(passw)
Crear un módulo para validación de contraseñas. Dicho módulo, deberá cumplir con los siguientes criterios de aceptación:
2.1 La contraseña debe contener un mínimo de 8 caracteres.
2.2 Una contraseña debe contener letras minúsculas, mayúsculas, números y al menos 1 carácter no alfanumérico.
2.3 La contraseña no puede contener espacios en blanco.
2.4 Contraseña válida, retorna True.
2.5 Contraseña no válida, retorna el mensaje "La contraseña elegida no es segura".

Solución módulo password. 
passw.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def clave(password):

        validar=False #que se vayan cumpliendo los requisitos uno a uno.
        long=len(password) #Calcula la longitud de la contraseña
        espacio=False  #variable para identificar espacios
        mayuscula=False #variable para identificar letras mayúsculas
        minuscula=False #variable para contar identificar letras minúsculas
        numeros=False #variable para identificar números
        y=password.isalnum()#si es alfanumérica retona True
        correcto=True #verifica que hayan mayuscula, minuscula, numeros y no alfanuméricos
        
        for carac in password: #ciclo for que recorre caracter por caracter en la contraseña

            if carac.isspace()==True: #Saber si el caracter es un espacio
                espacio=True #si encuentra un espacio se cambia el valor user

            if carac.isupper()== True: #saber si hay mayuscula
                mayuscula=True #acumulador o contador de mayusculas
                
            if carac.islower()== True: #saber si hay minúsculas
                minuscula=True #acumulador o contador de minúsculas
                
            if carac.isdigit()== True: #saber si hay números
                numeros=True #acumulador o contador de numeros
                            
        if espacio==True: #hay espacios en blanco
                print("La contraseña no puede contener espacios")
        else:
            validar=True #se cumple el primer requisito que no hayan espacios
                       
        if long <8 and validar==True:
            print("Mínimo 8 caracteres")
            validar=False #cambia a Flase si no se cumple el requisito móinimo de caracteres

        if mayuscula == True and minuscula ==True and numeros == True and y== False and validar ==True:
           validar = True #Cumple el requisito de tener mayuscula, minuscula, numeros y no alfanuméricos
        else:
           correcto=False #uno o mas requisitos de mayuscula, minuscula, numeros y no alfanuméricos no se cumple
           
        if validar == True and correcto==False:
           print("La contraseña elegida no es segura: debe contener letras minúsculas, mayúsculas, números y al menos 1 carácter no alfanumérico")

        if validar == True and correcto ==True:
           return True


3. MÓDULO VALIDADOR.(validador)

Crear un módulo que solicite al usuario el ingreso de un nombre de usuario y contraseña y que los valide utilizando los módulos generados en los dos ejercicios anteriores. Solución módulo validador.

Solución módulo validador.
validador.py 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import usuario
import passw

correcto=False
while correcto==False:
        nombre=input("Ingrese nombre de usuario: ")
        if usuario.nickname(nombre) == True:
            print("Usuario creado exitosamente")
            correcto=True

while correcto==True:
    contrasenia=input("Ingrese su Password: ")
    if passw.clave(contrasenia)==True:
        print("Contraseña creada exitosamente")
        correcto=False

PRUEBA DEL FUNCIONAMIENTO: En mi canal de Youtube podrás ver otros ejercicios realizados.




Hay muchos métodos para realizar este ejercicio, este fue el mio, espero sea claro y si queda alguno con dudas en este desarrollo con gusto las responderé O si tienes otra forma de hacerlo y la quieres compartir se recibe con gusto.

Recuerden: "La mayoría de los buenos programadores programan, no porque esperan que se les pague o por adulación por parte del público, sino porque es divertido programar."
- Linus Torvalds 

Éxitos!!!


35 comentarios:

  1. Que onda me puede dar un video para explicar!!!

    ResponderBorrar
  2. Que onda me puede dar un video para explicar!!!

    ResponderBorrar
    Respuestas
    1. Hola, tengo unos problemas con el micrófono por eso no he realizado el video. Pero si tiene alguna duda que pueda solucionar con mucho gusto.

      Borrar
    2. amigo copio tu codigo de contraseña y al momento de compilar con mis otros dos modulos me sale error solo el modulo para verificar contraseña.
      creo que es por la version que tu tienes yo tengo la 2.7 me podrias ayudar porfavor......
      muchas gracias de ante mano


      Borrar
  3. Hola , en solución modulo password entra en un ciclio infinito dentro del IF en contador.
    Fijate que cuando paso el ciclo iterativo While entro al FOR y dentro de ese for hay un IF y es ahi donde entro al ciclo infinito del contador.
    mi email es : rodrigo.nievarobles@hotmail.com
    saludos!

    ResponderBorrar
    Respuestas
    1. Hola, muchas gracias por visitar el blog. A mi no me genera error. De pronto ocurría algo cuando copiaba y pegaba el archivo al editor de texto, de todas maneras le hice un ajuste al ejercicio y lo reduje, ya que había código innecesario. Prueba esta nueva versión y nos cuentas.
      Hasta pronto

      Borrar
  4. hola disculpa a un primo le dejaron esto
    Diseñar y codificar un programa en python donde se valide un password de una correo electronico con los siguientes criterios:

    1. debe ser mayor o igual 8 caracteres
    2.debe contener al menos una mayuscula
    3.debe tener uno de estos caracteres !#$%&?+-*/
    5.naturalmente debe tener minusculas

    si el password cuenta con los puntos anteriores es valido,
    sino el programa dira por que razones no lo es.
    es parecido al codigo pero al momento de correr tu codigo marca error en validador ImportError: No module named 'usuario' si no es molestia nos puedes ayudar :)

    ResponderBorrar
    Respuestas
    1. El error que genera de "ImportError: No module named 'usuario' ", es por que debe crear el archivo usuario, que es el que verifica que las condiciones de usuario se cumplan. El código que busca es similar a este sólo falta agregar un compararador de cadenas para identificar esos caracteres "!#$%&?+-*/" . Para eso usaría un for por ejemplo:
      cont=0
      for caracter in password:
      if caracter in '!#$%&?+-*/':
      cont=cont+1

      Borrar
  5. hola buenas tardes disculpa en tu codigo me marca que paasword no esta definido lo trato de definir y me marca error :/

    ResponderBorrar
  6. Hola, aporto mi granito de arena, yo creé dos clases validator, para el user y el pass, dentro del directorio modules:

    class UserValidator():

    errors = []

    def check_size(self, username):
    if len(username) < 6:
    self.errors.append('El nombre de usuario debe contener al menos 6 caracteres')
    return False
    elif len(username) > 12:
    self.errors.append('El nombre de usuario no puede contener más de 12 caracteres')
    return False
    else:
    return True

    def check_alfa(self, username):
    if not username.isalnum():
    self.errors.append('El nombre de usuario puede contener sólo letras y números')
    return False
    else:
    return True

    def validate(self, username):
    is_valid = self.check_size(username) and self.check_alfa(username)
    return is_valid

    y la clase que valida los passwords:

    # -*- coding: utf-8 -*-


    class PassValidator():

    errors = []

    def check_size(self, password):
    if len(password) < 8:
    self.errors.append('La contraseña debe tener al menos 8 caracteres')
    return False
    else:
    return True

    def check_mayusculas(self, password):
    if password.islower():
    self.errors.append('La contraseña debe tener al menos una mayúscula')
    return False
    else:
    return True

    def check_minusculas(self, password):
    if password.isupper():
    self.errors.append('La contraseña debe tener al menos una minúscula')
    return False
    else:
    return True

    def check_numeros(self, password):
    have_num = False

    for letter in password:
    if letter.isdigit():
    have_num = True

    if not have_num:
    self.errors.append('La contraseña debe contener al menos un número')

    return have_num

    def check_alfanumerico(self, password):
    if password.isalnum():
    self.errors.append('La contraseña debe tener al menos un caracter no alfanumérico')
    return False
    else:
    return True

    def check_spaces(self, password):
    if password.count(' ') > 0:
    self.errors.append('La contraseña no puede contener espacios en blanco')
    return False
    else:
    return True

    def validate(self, password):
    size = self.check_size(password)
    mayusculas = self.check_mayusculas(password)
    minusculas = self.check_minusculas(password)
    numeros = self.check_numeros(password)
    alfanumerico = self.check_alfanumerico(password)
    spaces = self.check_spaces(password)

    return size and mayusculas and minusculas and numeros and alfanumerico and spaces


    Luego las utilizo en login,py:

    # -*- coding: utf-8 -*-

    import modules.validators.user_validator as uv
    import modules.validators.pass_validator as pv

    user_validator = uv.UserValidator()
    pass_validator = pv.PassValidator()

    nombre = raw_input('Ingrese su nombre de usuario: ')
    passwd = raw_input('Ingrese su contraseña: ')

    if not user_validator.validate(nombre):
    for error in user_validator.errors:
    print error

    if not pass_validator.validate(passwd):
    for error in pass_validator.errors:
    print error


    cualquier sugerencia o corrección es bienvenida!.
    Saludos!

    Sergio Gabriel Rodriguez
    Corrientes - Argentina

    ResponderBorrar
    Respuestas
    1. Hola, muchas gracias Sergio por visitar el Blog y compartir conocimientos. Es un valioso aporte para seguir creciendo este Blog, haré otra entrada explicando este código

      Borrar
    2. de nada! muy bueno tu blog, estoy iniciandome en Python y me gustaría compartir conocimientos entre todos, un abrazo.

      Sergio

      Borrar
  7. hola, me ayudó mucho ojalá pudiera regresarte el apoyo.

    ResponderBorrar
  8. Más granitos de arena ...

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-

    import string

    validador = string.letters + string.digits + "ñÑ_/*-+!#$%&?¿@"
    validador = validador.decode('utf8')

    while True:
    bandera = True # Varible que controla la validez de la contraseña
    vcd, vcu, vcl, vca = 0, 0, 0, 0 # Variables contadoras: vcd->dígitos, vcu->mayúsculas, vcl->minúsculas, vca->caracteres especiales

    contrasenia = raw_input("Inserte contraseña de usuario: ") # Solicitar contraseña por pantalla
    contrasenia = contrasenia.decode('utf8') # Codificar la entrada en UTF-8

    len_contrasenia = len(contrasenia) # Longitud de la cadena de entrada

    # Validador por caracter de la contraseña
    for carac in contrasenia:
    bandera = (bandera) and (carac in validador) # Si es un caracter válido excluyendo el espacio
    vcd += carac.isdigit() * 1 # Incrementa en uno si es un dígito
    vcu += carac.isupper() * 1 # Incrementa en uno si es una letra mayúscula
    vcl += carac.islower() * 1 # Incrementa en uno si es una letra minúscula
    vca += (carac in "/_*-+!#$%&?¿@".decode('utf8')) * 1 # Incrementa en uno si es un caracter especial

    if not bandera:
    print "\nError: Caracteres no validos ...\nCaracteres válidos: " + validador +"\n"
    continue

    if not len_contrasenia >= 8:
    print "\nLongitud de contraseña errónea. Debe ser mayor a 8 caracteres ...\n"
    continue

    bandera = (bandera * vcd * vcu * vcl * vca) > 0
    if not bandera:
    print "\nError: La contraseña debe tener al menos 1 numero, una letra minúscula, una letra mayúscula y un caracter especial ...\n"
    continue

    break

    if bandera:
    print "Contraseña válida".upper()

    ResponderBorrar
  9. Buenas tardes paso a dejarte mi resolucion a lo mismo usando recursividad

    Usuario:

    def validarUsuario(usuario):
    usuario = input("Ingrese el nombre de usuario: ")
    if not(usuario.isalnum()):
    print ("El nombre del usuario puede contener solo letras y numeros")
    validarUsuario(usuario)
    elif len(usuario)<6:
    print ("El nombre de usuario tiene que tener minimo 6 caracteres")
    validarUsuario(usuario)
    elif len(usuario)>12:
    print ("El nombre de usuario tiene que tener menos de 12 caracteres")
    validarUsuario(usuario)
    return True

    usuario = " "
    validarUsuario(usuario)


    Contraseña:

    def validarContra(contra):
    contra = input("Ingrese la contraseña: ")
    longuitud = len(contra)
    tieneMay = False
    tieneMin = False
    tieneNum = False
    tieneEsp = False
    tieneCar = False
    if ((contra.isalnum()==False) and (longuitud>=8)):
    for c in contra:
    if c.isupper()==True:
    tieneMay=True
    if c.islower()==True:
    tieneMin=True
    if c.isdigit()==True:
    tieneNum=True
    if c==" ":
    tieneEsp=True
    if (tieneMay and tieneMin and tieneNum and (not(tieneEsp))):
    print ("La contraseña introducida cumple con los requisitos")
    return True
    else:
    print ("La contraseña no cumple con los requisitos")
    validarContra(contra)
    contra= " "
    validarContra(contra)

    ResponderBorrar
    Respuestas
    1. Muchas gracias por tu aporte!, haré otra entrada explicando este código para otros usuarios.

      Borrar
  10. Hola!! buenas noches me podrían explicar como se hace una validación mediante tokens de una dirección IP
    con regular expression en python.

    ResponderBorrar
  11. Hola mi amigo lo estoy tratando de usar para validar correos electronicos muchas gracias

    ResponderBorrar
  12. Buenas man, no hace falta poner if x == True:
    ...
    Si la funcion se cumple, se ejecuta lo que este debajo.
    If x:
    ...
    Salutes.

    ResponderBorrar
  13. Y como pregunta, ¿estos archivos de validación los puedo poner al querer entrar en una página web?
    Me explico, tengo un código que me permite hacer ver en una página web lo que captura una pi-camera, y querría saber si se puede y cómo se puede pedir validación al entrar en esa página.
    Gracias de antemano

    ResponderBorrar
  14. por favor me pueden ayudar con el codigo de como crear una contraseña en dev c++ si por favor

    ResponderBorrar
  15. alguien puede pasar el modulo 2 y 3 a c++

    ResponderBorrar
  16. amigo copio tu codigo de contraseña y al momento de compilar con mis otros dos modulos me sale error solo el modulo para verificar contraseña.
    creo que es por la version que tu tienes yo tengo la 2.7 me podrias ayudar porfavor......
    muchas gracias de ante mano


    ResponderBorrar
  17. Me encantó, me ayudo muchisimo en un proyecto que tengo de python en la universidad... Sigan asi por favor es excelente que hayan personas que quieran ayudar a los demás

    ResponderBorrar
  18. Hola soy nuevo en el mundo de la programación, inexperto total seguí tu código pero me genera este error "C:\Users\User\PycharmProjects\user_and_pass\venv\Scripts\python.exe C:/Users/User/PycharmProjects/user_and_pass/validador.py
    Ingrese nombre de usuario:elber1234
    Traceback (most recent call last):
    File "C:/Users/User/PycharmProjects/user_and_pass/validador.py", line 6, in
    nombre = input("Ingrese nombre de usuario:")
    File "", line 1, in
    NameError: name 'elber1234' is not defined

    Process finished with exit code 1"

    ResponderBorrar
  19. Gracias, funciona a la perfección, lo corrí en el editor IDLE de Python 3.9, pero cuando lo ejecuto en Sublimetext3, se queda colgado en, Ingrese nombre de usuario:,debo estar omitiendo algo en Sublimetext3?

    ResponderBorrar
  20. Cuando ejecuto un programa, pero a pesar de estar bien escrito el código, genera error, simplemente abro un archivo nuevo en python3, lo guardo con su extensión py y luego lo ejecutó y zas corre perfectamente. Muy a pesar que lo escribo en el editor de Sublime Text 3.

    ResponderBorrar
  21. Hola, como puedo acomodar para generar un ususario y contraseña especifico y que si es errada me tire error? gracias
    Por ejemplo un numero de 5 cifras

    ResponderBorrar
  22. hola como hago para que la contraseña no contenga un numero repetido. gracias

    ResponderBorrar
  23. Este es mi codigo:

    def password():

    contraseña=input("Introduzca contraseña: ")
    longitud=len(contraseña)
    mayusculas=False
    minusculas=False
    caracterEspecial=False
    espacio=False

    if contraseña.isalnum()==False and longitud>=8:

    for caracter in contraseña:

    if caracter.isupper()==True:
    mayusculas=True
    if caracter.islower()==True:
    minusculas=True
    if caracter.isalnum()==True:
    caracterEspecial=True
    if " " in caracter:
    espacio=True

    if mayusculas==True and minusculas==True and caracterEspecial==True and espacio==False:
    print("Contraseña correcta")
    else:
    print("La contraseña elegida no es segura, debe contener al menos 8 caracteres, letras minúsculas, mayúsculas, números, al menos 1 carácter no alfanumérico y no contener espacios.")


    password()

    ResponderBorrar
  24. me pueden ayudar por favor ,soy nueva con este tipo de programa
    Realizar los siguientes ejercicios con funciones:
    # * Crear un diccionario donde se almacene el usuario y la clave.
    # * Pedir el ingreso por teclado de usuario y clave.
    # * Validar que lo ingresado sea igual a los datos del diccionario, de lo contrario mostrará un error de inicio de sesión. El usuario solo tiene un máximo de 3 intentos fallidos, al superarlos termina el programa.
    # * Cuando el inicio de sesión es correcto, pasa un menú de dos opciones:
    # 1. Convertir fecha en texto.
    # 2. Calcular tiempo de nacido.
    # * En la primera opción, solicitar por teclado una fecha en formato "11/02/2022", crear una función que devuelva lo siguiente "Viernes, 11 de febrero de 2022".
    # * La segunda opción, solicitar la fecha de nacimiento, crear una función que devuelva los años, meses y días de nacido (edad).


    ResponderBorrar