Mostrando entradas con la etiqueta validación. Mostrar todas las entradas
Mostrando entradas con la etiqueta validación. Mostrar todas las entradas

lunes, 25 de agosto de 2025

WEBPROPv2 (IV). Validación de usuarios sin nginx (II). Log in. Utilización del LDAP

 0. Introducción

En el módulo routes01menu.py en el endpoint "/softprop/validate_login" que está definido por la función post_login, hacemos esta llamada

ldap_authenticated= xmldap.autheticate_by_login(login.usuari, login.paraula_de_pass)

Por tanto todo el tema de autenticación por LDAP se realiza en módulo "xmldap.py"

1. el módulo xmldap.py

Este módulo accede a unas propiedades para poder conectarse al servidor LDAP.

En concreto el fichero que guarda las propiedades tiene este contenido:

ldapWindows:
  serverName: mi-servidor.edificio.poblacion
  userPrefix: edificio\

Veamos el código del módulo xmldap.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
from ldap3 import Server, Connection, ALL, SUBTREE, ALL_ATTRIBUTES ,SAFE_SYNC, NTLM, ALL_ATTRIBUTES
import sys
import os
#------Imprescindible para poder importar de otras carpetas (de basicutils)
import sys
from pathlib import Path
path_root1 = Path(__file__).parents[1] # Damos un salto de directorio hacia arriba-> ximoutilsmod
sys.path.append(str(path_root1))
path_root0 = Path(__file__).parents[0] # El mismo directorio
sys.path.append(str(path_root0))
from basicutils import xmcrypto, xmfile
# ------Fin imprescindible


def get_props():
	logs=[]
	logs.append('env='+str(os.environ))
	logs.append('os.getenv("CONF_PYTHON")='+str(os.getenv("CONF_PYTHON")))
	xmfile.add_lines_to_file('/home/eduard/kk.log', logs)
	conf_file=os.getenv("CONF_PYTHON")+'ldap.encrypted.yml'
	config= xmcrypto.get_properties_from_file(conf_file)
	return config['ldapWindows']

'''Autheticate by login name and password'''
def autheticate_by_login(username: str, password: str)->bool:
	config=get_props()
	try:
		server = Server(config['serverName'], get_info=ALL)
		my_user=config['userPrefix']+username
		conn = Connection(server, user=my_user, password=password)
		if conn.bind():
			print('xmldap.autheticate_by_login: OK')
			return True
		else:
			print('xmldap.autheticate_by_login: FALSE')
			return False
	except Exception as e:
		print(f"LDAP error1 : {e}", file=sys.stderr)
		if 'conn' in locals():
			conn.unbind()
		return False

Lo importante de este código es:

  • La importación de los objetos necesarios de la biblioteca ldap3, en este caso Server y Connection que se encuentra en la primera línea
  • La función get_props solamente sirve para leer las propiedades que se muestran arriba que se encuentran en un fichero encriptado
  • Para ver si las credenciales son correctas primeramewnte se define el servidor con solo decir su nombre (Línea  28).
  • El usuario hay que pasarlo con un prefijo que se encuentra en propiedades (Línea 29)
  • Si se intenta hacer la conexión al servidor con el usuario (+ prefijo) y contraseña introducida, yu es correcta entonces las credenciales del usuario son correctas y quedan validadas.(Líneas 28-33)
  • Si no se establece la conexión, entonces hya un error (seguramente de credenciales)