La autentificación puede ser usada para autentificar una sesión, es decir, identificar al usuario que se encuentra al lado cliente de la sesión.
La autentificación que ofrece PHPLib es realizada con formularios HTML, no mediante la autentificación HTTP (la ventana popup que aparece cuando se trata abrir una página protegida con htaccess). La autentificación que usa PHPLib tiene varias ventajas:
- Se puede deshacer. Una sesión puede ser des-autentificada, el usuario puede hacer un “log out”.
- Puede expirar. Una sesión se podría des-autentificar automáticamente después de cierto tiempo.
- Puede ser configurada. No se está limitado al par usuario/contraseña. Se podría usar un número de cliente, identificador de operador y una password para hacer login. También, se tiene un control completo de la pantalla de login, que es una página HTML normal.
- Es basada en base de datos. La autentificación es realizada contra una base de datos de diseño propio, no un archivo de texto htpasswd.
- Es por página. Uno decide, según la página, cuales serán autentificadas y cuales no.
- Se puede integrar con un esquema de verificación de permisos.
La autentificación de PHPLib hace uso de la clase Auth.
3.1 Variables de Auth
- classname. Nombre de la clase.
- lifetime. Cantidad máxima de tiempo ocioso antes de que la autentificación expire. Si se deja en 0, la autentificación nunca expirará (siempre y cuando la sesión se mantiene activa).
- refresh. Cantidad máxima de tiempo antes de que la información de autentificación (por ejemplo permisos) son re-leídos de la base de datos usando el método auth_refreshlogin(). Si se deja en 0, la información de autentificación sólo es leída al momento del login.
- mode. Modo de autentificación: log o reg.
- database_class. Nombre de clase. Auth usa esta clase para establecer una conexión a la base de datos.
- database_table. Tabla de base de datos para guardar las variables de sesión.
- magic. Valor arbitrario usado en la generación del uniqid.
- nobody. Un flag: si está en true, se usa autentificación por defecto.
3.2 Ejemplo de una sub-clase Auth
La siguente clase, a su vez sub-clase de Auth, se llamará Prueba_Auth, y en la cuál bastaría con definir:
var $classname = "Prueba_Auth"; # nombre de la clase. var $lifetime = 15; # duración de la sesión autentificada. var $database_class = "DB_Prueba"; # clase de conexión a BD. var $database_table = "auth_user"; # tabla con la info de los usuarios.
Luego nuestra clase Prueba_Auth quedaría como:
class Prueba_Auth extends Auth { var $classname = "Prueba_Auth"; var $lifetime = 15; # minutos var $database_class = "DB_Prueba"; var $database_table = "auth_user"; function auth_loginform() {
global∞ $sess;
global∞ $_PHPLIB; # nombre de archivo html que mostrará el formulario # usuario/contraseña cuando no exista una sesión # autentificada o esta haya expirado. # por defecto este archivo se encuentra en $_PHPLIB["libdir"] include($_PHPLIB["libdir"] . "loginform.ihtml"); } function auth_validatelogin() {
global∞ $HTTP_POST_VARS; if(
isset∞($HTTP_POST_VARS["username"])) { $this->auth["uname"] = $HTTP_POST_VARS["username"]; } # uid se deja en falso. $uid = false; # se consulta si la combinación usuario/contraseña # existe en tabla de usuarios. $this->db->query(
sprintf∞("select user_id, perms ". " from %s ". " where username = '%s' ". " and password = '%s'", $this->database_table,
addslashes∞($HTTP_POST_VARS["username"]),
addslashes∞($HTTP_POST_VARS["password"]))); # se obtiene el uid y los permisos del usuario si existe. while($this->db->next_record()) { $uid = $this->db->f("user_id"); $this->auth["perm"] = $this->db->f("perms"); } # retorna el uid, si usuario no existe retornará uid = false. return $uid; }}
3.3 Ejemplo de una página restringida
Una vez configuradas correctamente nuestras clases de sesión y autentificación, podriamos crear una página restringida sólo a usuarios vlidos, específicamente los que se encuentran en nuestra tabla auth_user.
Acá es donde el PHPLib se luce... basta que usemos las funciones page_open() y page_close(), al inicio y final de la página respectivamente para que todo lo que se encuentre entre estas funciones sólo pueda ser ejecutado por usuarios autentificados.
<?php # page_open recibe como parametros las clases sess, auth y perm# previamente configuradas, validando al usuario/contraseña ingresado# vía el formulario que se muestra la primera vez. page_open(
array∞("sess" => "Prueba_Session", "auth" => "Prueba_Auth", "perm" => "Example_Perm")); /* código restringido a usuarios válidos */ # la funcion page_close() se debe ejecutar siempre al final de la# página para que se guarde/mantenga la info de la sesión. page_close(); ?>
La idea es que cada página restringida lláme a las funciones page_open() y page_close(), y cada vez que se acceda a las páginas se verificará si existe una sesión autentificada, si no es el caso, se mostraró el formulario (que es totalmente personalizable) de usuario/contraseña.
3.4 Terminar una sesión autentificada
Para terminar (eliminar) una sesión bastaría con ejecutar el método logout() de la clase Auth:
$auth->logout();
Para esto, podriamos crear una pgina salir.php que quedaría como:
<?php # verificamos si existe una sesiónpage_open(
array∞("sess" => "Prueba_Session", "auth" => "Prueba_Auth","perm" => "Example_Perm")); # se termina la sesión$auth->logout(); # volvemos al index.php sin mostar nada en pantalla
header∞("location: index.php"); ?>