-
Notifications
You must be signed in to change notification settings - Fork 24
/
toba_autenticacion_ldap.php
129 lines (118 loc) · 4.28 KB
/
toba_autenticacion_ldap.php
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
class toba_autenticacion_ldap extends toba_autenticacion implements toba_autenticable
{
protected $server;
protected $dn;
protected $bind_dn = null;
protected $bind_pass = null;
protected $filter = 'uid=%s';
function __construct($server=null, $dn=null) {
$this->server = $server;
$this->dn = $dn;
//--- Levanto la CONFIGURACION de ldap.ini
$archivo_ini_instalacion = toba::nucleo()->toba_instalacion_dir().'/ldap.ini';
if (is_file( $archivo_ini_instalacion ) ) {
$datos = toba::config()->get_subseccion('idp','ldap');
if (isset($datos['basicos']['server'])) {
$this->server = $datos['basicos']['server'];
}
if (isset($datos['basicos']['dn'])) {
$this->dn = $datos['basicos']['dn'];
}
if (isset($datos['basicos']['bind_dn'])) {
$this->bind_dn = $datos['basicos']['bind_dn'];
}
if (isset($datos['basicos']['bind_pass'])) {
$this->bind_pass = $datos['basicos']['bind_pass'];
}
if (isset($datos['basicos']['filter'])) {
$this->filter = $datos['basicos']['filter'];
}
}
}
/**
* Realiza la autentificacion utilizando un servidor LDAP
* @return boolean Retorna TRUE o FALSE de acuerdo al estado de la autentifiacion
*/
function autenticar($id_usuario, $clave, $datos_iniciales=null)
{
if (self::$modo_debug) {
toba_logger::instancia()->var_dump($this->server);
toba_logger::instancia()->var_dump($this->dn);
toba_logger::instancia()->var_dump($this->bind_dn);
toba_logger::instancia()->var_dump($this->bind_pass);
toba_logger::instancia()->var_dump($this->filter);
}
if (! extension_loaded('ldap')) {
throw new toba_error("[Autenticación LDAP] no se encuentra habilitada la extensión LDAP");
}
$conexion = @ldap_connect($this->server);
ldap_set_option($conexion, LDAP_OPT_PROTOCOL_VERSION, 3);
if (! $conexion) {
toba::logger()->error('[Autenticación LDAP] No es posible conectarse con el servidor: '.ldap_error($conexion));
return false;
}
//$bind = @ldap_bind($conexion);
$bind = @ldap_bind($conexion, $this->bind_dn, $this->bind_pass);
if (! $bind) {
toba::logger()->error('[Autenticación LDAP] No es posible conectarse con el servidor: '.ldap_error($conexion));
return false;
}
$res_id = @ldap_search($conexion, $this->dn, sprintf($this->filter, $id_usuario));
if (! $res_id) {
toba::logger()->error('[Autenticación LDAP] Fallo búsqueda en el árbol: '.ldap_error($conexion));
return false;
}
$cantidad = ldap_count_entries($conexion, $res_id);
if ($cantidad == 0) {
toba::logger()->error("[Autenticación LDAP] El usuario $id_usuario no tiene una entrada en el árbol");
return false;
}
if ($cantidad > 1) {
toba::logger()->error("[Autenticación LDAP] El usuario $id_usuario tiene más de una entrada en el árbol");
return false;
}
$entrada_id = ldap_first_entry($conexion, $res_id);
if ($entrada_id == false) {
toba::logger()->error("[Autenticación LDAP] No puede obtenerse el resultado de la búsqueda". ldap_error($conexion));
return false;
}
$usuario_dn = ldap_get_dn($conexion, $entrada_id);
if ($usuario_dn == false) {
toba::logger()->error("[Autenticación LDAP] No pude obtenerse el DN del usuario: ". ldap_error($conexion));
return false;
}
$link_id = @ldap_bind($conexion, $usuario_dn, $clave);
if ($link_id == false) {
toba::logger()->error("[Autenticación LDAP] Usuario/Contraseña incorrecta: ".ldap_error($conexion));
return false;
}
ldap_close($conexion);
$usuario = $this->recuperar_usuario_toba($id_usuario);
toba::logger()->debug("[Autenticación LDAP] OK");
return true;
}
function verificar_clave_vencida($id_usuario)
{
return false;
}
function logout()
{
//Definicion para completar API.
$this->eliminar_marca_login(self::$marca_login_basico);
$this->eliminar_marca_login(self::$marca_login_central);
}
function verificar_logout()
{
}
protected function recuperar_usuario_toba($id_usuario)
{
$datos_usuario = toba::instancia()->get_info_autenticacion($id_usuario);
if (! isset($datos_usuario)) { //El usuario no existe en la bd de toba.
toba::logger()->crit("El usuario LDAP '$id_usuario' no existe en la instancia toba");
throw new toba_error_autenticacion("El usuario '$id_usuario' no esta dado de alta en el sistema");
}
return $id_usuario;
}
}
?>