ValidaSesion.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. /**
  3. * Clase para validar la sesión del usuario y que el usuario esté activo.
  4. *
  5. * @author Alejandro
  6. */
  7. class ValidaSesion {
  8. private $acceso, $edicion, $pagina, $sistema = 8;//guarda si el usuario puede acceder y/o editar
  9. private $error, $hasError = false;
  10. /**
  11. * Constructor
  12. * @return boolean
  13. */
  14. function __construct($pdo, $submenu) {
  15. if (session_status() == PHP_SESSION_NONE) {
  16. session_start();
  17. }
  18. $session_life = 1*60*60;//1 hora convertido a segundos
  19. // check to see if $_SESSION["timeout"] is set
  20. if (isset($_SESSION['timeout'])) {
  21. // calculate the session's "time to live"
  22. $sessionTTL = time() - $_SESSION['timeout'];
  23. if ($sessionTTL > $session_life) {
  24. $this->terminaSesion();
  25. }
  26. }else
  27. $this->terminaSesion();
  28. $_SESSION['timeout'] = time();
  29. if(!isset($_SESSION['usuario_id']) || $_SESSION['usuario_id'] == '') $this->terminaSesion();
  30. //existe id en sesión?
  31. if(array_key_exists("usuario_id", $_SESSION) && is_numeric($_SESSION["usuario_id"]) && $_SESSION["usuario_id"] > 0){
  32. if(is_int($submenu)){
  33. $this->obtenerNombrePagina($pdo, $submenu);
  34. //valida permisos
  35. $stmt = $pdo->prepare('Select * from alu_fs_validapermisos(:rol, :sub)');//devuelve: permiso, edicion
  36. $stmt->bindParam(":rol", $_SESSION["RolUsuario_id"]);
  37. $stmt->bindParam(":sub", $submenu);
  38. if(!$stmt->execute()){
  39. $this->hasError = true;
  40. $this->error = $stmt->errorInfo();
  41. }else{
  42. $rs = $stmt->fetch();
  43. $stmt->closeCursor(); // cierra conexion de resultado
  44. $stmt = null; // cierra conexion
  45. //si es administrador de sistema, siempre es true
  46. $this->acceso = (bool) $rs["permiso"];
  47. $this->edicion = (bool) $rs["edicion"];
  48. $rs = null;
  49. }
  50. }else if(is_array($submenu)){
  51. $stmt = $pdo->prepare('Select * from alu_fs_validapermisos(:sub, :sist)');//devuelve: permiso, edicion
  52. $stmt->bindParam(":sist", $this->sistema);
  53. foreach($submenu as $subItem){
  54. if(!$this->hasError){
  55. //valida permisos
  56. $stmt->bindParam(":sub", $subItem);
  57. if(!$stmt->execute()){
  58. $this->hasError = true;
  59. $this->error = $stmt->errorInfo();
  60. }else{
  61. $rs = $stmt->fetch();
  62. //si es administrador de sistema, siempre es true
  63. $this->acceso = $this->acceso || (bool) $rs["permiso"];
  64. $this->edicion = $this->edicion || (bool) $rs["edicion"];
  65. $rs = null;
  66. }
  67. }
  68. }
  69. $stmt->closeCursor(); // cierra conexion de resultado
  70. $stmt = null; // cierra conexion
  71. }else if(is_null($submenu)){
  72. //Valida permisos de acceso sistema
  73. $stmt = $pdo->prepare('Select * from fs_validasistema(:usr, :sist)');//devuelve: permiso, edicion
  74. $stmt->bindParam(":usr", $_SESSION["usuario_id"]);
  75. $stmt->bindParam(":sist", $this->sistema);
  76. if(!$stmt->execute()){
  77. $this->hasError = true;
  78. $this->error = $stmt->errorInfo();
  79. }else{
  80. $rs = $stmt->fetch();
  81. $stmt->closeCursor(); // cierra conexion de resultado
  82. $stmt = null; // cierra conexion
  83. $this->acceso = (bool) $rs["permiso"];
  84. $this->edicion = false;//acceso a sistema no tiene edición
  85. $rs = null;
  86. }
  87. }else{
  88. $this->hasError = true;
  89. $this->error = "Dato no válido en validación de permisos";
  90. }
  91. }else{
  92. $this->error = "No existe la llave en sesión";
  93. $this->hasError = true;
  94. $this->acceso = false;
  95. $this->edicion = false;
  96. }
  97. if($this->hasError){
  98. $this->acceso = false;
  99. $this->edicion = false;
  100. }
  101. }
  102. private function obtenerNombrePagina($pdo, $submenu){
  103. $this->pagina = '';
  104. try {
  105. $stmt = $pdo->prepare('SELECT "Submenu_desc" FROM fs_menusubmenus(:sist) WHERE "Submenu_id" = ' . $submenu );
  106. $stmt->bindParam(":sist", $this->sistema);
  107. if($stmt->execute()){
  108. $temp = $stmt->fetch();
  109. if (isset($temp['Submenu_desc']))
  110. $this->pagina = $temp['Submenu_desc'];
  111. }
  112. } catch (\PDOException $ex) {}
  113. $stmt->closeCursor();
  114. $stmt = null;
  115. }
  116. function nombrePagina(){
  117. return $this->pagina;
  118. }
  119. function tieneAcceso(){
  120. return $this->acceso;
  121. }
  122. function puedeEditar(){
  123. return $this->acceso && $this->edicion;
  124. }
  125. function tieneError(){
  126. return $this->hasError;
  127. }
  128. function getError(){
  129. return $this->error;
  130. }
  131. function terminaSesion(){
  132. $_SESSION = array();
  133. session_destroy();
  134. header('Location: salir.php?expired=1');
  135. exit();
  136. }
  137. public static function salirPagina(){
  138. $_SESSION = array();
  139. session_destroy();
  140. header('Location: salir.php');
  141. exit();
  142. }
  143. public static function errorBD(){
  144. $_SESSION = array();
  145. session_destroy();
  146. header('Location: error.php');
  147. exit();
  148. }
  149. }