123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- <?php
- /**
- * Clase para validar la sesión del usuario y que el usuario esté activo.
- *
- * @author Alejandro
- */
- class ValidaSesion {
- private $acceso, $edicion, $pagina, $sistema = 8;//guarda si el usuario puede acceder y/o editar
- private $error, $hasError = false;
-
- /**
- * Constructor
- * @return boolean
- */
- function __construct($pdo, $submenu) {
- if (session_status() == PHP_SESSION_NONE) {
- session_start();
- }
- $session_life = 1*60*60;//1 hora convertido a segundos
- // check to see if $_SESSION["timeout"] is set
- if (isset($_SESSION['timeout'])) {
- // calculate the session's "time to live"
- $sessionTTL = time() - $_SESSION['timeout'];
- if ($sessionTTL > $session_life) {
- $this->terminaSesion();
- }
- }else
- $this->terminaSesion();
- $_SESSION['timeout'] = time();
-
- if(!isset($_SESSION['usuario_id']) || $_SESSION['usuario_id'] == '') $this->terminaSesion();
-
- //existe id en sesión?
- if(array_key_exists("usuario_id", $_SESSION) && is_numeric($_SESSION["usuario_id"]) && $_SESSION["usuario_id"] > 0){
- if(is_int($submenu)){
- $this->obtenerNombrePagina($pdo, $submenu);
- //valida permisos
- $stmt = $pdo->prepare('Select * from alu_fs_validapermisos(:rol, :sub)');//devuelve: permiso, edicion
- $stmt->bindParam(":rol", $_SESSION["RolUsuario_id"]);
- $stmt->bindParam(":sub", $submenu);
- if(!$stmt->execute()){
- $this->hasError = true;
- $this->error = $stmt->errorInfo();
- }else{
- $rs = $stmt->fetch();
- $stmt->closeCursor(); // cierra conexion de resultado
- $stmt = null; // cierra conexion
- //si es administrador de sistema, siempre es true
- $this->acceso = (bool) $rs["permiso"];
- $this->edicion = (bool) $rs["edicion"];
- $rs = null;
- }
- }else if(is_array($submenu)){
- $stmt = $pdo->prepare('Select * from alu_fs_validapermisos(:sub, :sist)');//devuelve: permiso, edicion
- $stmt->bindParam(":sist", $this->sistema);
- foreach($submenu as $subItem){
- if(!$this->hasError){
- //valida permisos
- $stmt->bindParam(":sub", $subItem);
- if(!$stmt->execute()){
- $this->hasError = true;
- $this->error = $stmt->errorInfo();
- }else{
- $rs = $stmt->fetch();
- //si es administrador de sistema, siempre es true
- $this->acceso = $this->acceso || (bool) $rs["permiso"];
- $this->edicion = $this->edicion || (bool) $rs["edicion"];
- $rs = null;
- }
- }
- }
- $stmt->closeCursor(); // cierra conexion de resultado
- $stmt = null; // cierra conexion
- }else if(is_null($submenu)){
- //Valida permisos de acceso sistema
- $stmt = $pdo->prepare('Select * from fs_validasistema(:usr, :sist)');//devuelve: permiso, edicion
- $stmt->bindParam(":usr", $_SESSION["usuario_id"]);
- $stmt->bindParam(":sist", $this->sistema);
- if(!$stmt->execute()){
- $this->hasError = true;
- $this->error = $stmt->errorInfo();
- }else{
- $rs = $stmt->fetch();
- $stmt->closeCursor(); // cierra conexion de resultado
- $stmt = null; // cierra conexion
- $this->acceso = (bool) $rs["permiso"];
- $this->edicion = false;//acceso a sistema no tiene edición
- $rs = null;
- }
- }else{
- $this->hasError = true;
- $this->error = "Dato no válido en validación de permisos";
- }
- }else{
- $this->error = "No existe la llave en sesión";
- $this->hasError = true;
- $this->acceso = false;
- $this->edicion = false;
- }
- if($this->hasError){
- $this->acceso = false;
- $this->edicion = false;
- }
- }
- private function obtenerNombrePagina($pdo, $submenu){
- $this->pagina = '';
- try {
- $stmt = $pdo->prepare('SELECT "Submenu_desc" FROM fs_menusubmenus(:sist) WHERE "Submenu_id" = ' . $submenu );
- $stmt->bindParam(":sist", $this->sistema);
- if($stmt->execute()){
- $temp = $stmt->fetch();
- if (isset($temp['Submenu_desc']))
- $this->pagina = $temp['Submenu_desc'];
- }
- } catch (\PDOException $ex) {}
- $stmt->closeCursor();
- $stmt = null;
- }
- function nombrePagina(){
- return $this->pagina;
- }
- function tieneAcceso(){
- return $this->acceso;
- }
-
- function puedeEditar(){
- return $this->acceso && $this->edicion;
- }
-
- function tieneError(){
- return $this->hasError;
- }
-
- function getError(){
- return $this->error;
- }
-
- function terminaSesion(){
- $_SESSION = array();
- session_destroy();
- header('Location: salir.php?expired=1');
- exit();
- }
-
- public static function salirPagina(){
- $_SESSION = array();
- session_destroy();
- header('Location: salir.php');
- exit();
- }
-
- public static function errorBD(){
- $_SESSION = array();
- session_destroy();
- header('Location: error.php');
- exit();
- }
- }
|