Foros del Web » Programando para Internet » PHP »

Clase login terminada

Estas en el tema de Clase login terminada en el foro de PHP en Foros del Web. Hola a todos, el dia de ayer me propuse hacer una clase para logueo, ya que en el proyecto que voy a realizar se requiere ...
  #1 (permalink)  
Antiguo 09/06/2010, 07:52
 
Fecha de Ingreso: febrero-2009
Ubicación: mexico
Mensajes: 148
Antigüedad: 15 años, 2 meses
Puntos: 1
De acuerdo Clase login terminada

Hola a todos, el dia de ayer me propuse hacer una clase para logueo, ya que en el proyecto que voy a realizar se requiere un autentificacion de diferentes tipos de usuarios, le di vueltas y hoy la termine, para quien quiera aplicarla la dejo, se aceptan criticas y comentarios

Conexion.class.php
Código:
<?php
class Conexion
{
    private $cn;
    private $rs;
    private $servidor;
    private $usuario;
    private $password;
    private $bd;

    public function __construct($servidor = "localhost", $usuario = "root", $password =
        "220785", $bd = "sce")
    {
        $this->servidor = $servidor;
        $this->usuario = $usuario;
        $this->password = $password;
        $this->bd = $bd;
        $this->cn = new mysqli($servidor, $usuario, $password, $bd);
    }
    public function dbExecute($query)
    {
        $this->rs = $this->cn->query($query);
        return $this->rs;
    }
    public function getInsertedId()
    {
        return $this->cn->insert_id;
    }
    public function afectados()
    {
        return $this->cn->affected_rows;
    }
    protected function clean($value)
    {
        if (get_magic_quotes_gpc()) {
            $value = stripslashes($value);
        }
        $value = mysql_real_escape_string(htmlspecialchars($value));
        return $value;
    }
    public function __destruct()
    {
        $this->cn;
    }
}
?>
Login.class.php

Código:
<?php
class Login extends Conexion
{
    private $usuario;
    private $password;
    private $tipo_usuario;
    private $nivel;

    public function __construct()
    {
        parent::__construct();
        parent::__destruct();
    }
    public function comprueba($usuario, $password, $tipo_usuario)
    {
        $this->usuario = $this->clean($usuario);
        $this->password = $this->clean($password);
        $this->tipo_usuario = $tipo_usuario;
        //Comprueba el tipo de usuario
        if ($tipo_usuario == "Alumno") {
            $query = "SELECT id_alumno,password,status FROM alumnos WHERE id_alumno='$usuario' AND password='$password'";
        } elseif ($tipo_usuario == "Empleado") {
            $query = "SELECT id_empleado,password,nivel,status FROM empleados WHERE id_empleado='$usuario' AND password='$password'";
        }
        return $this->dbExecute($query);//Devuelve resultado de consulta
    }
    public function crear_sesion($tipo_usuario, $nivel, $usuario)
    {
        $this->tipo_usuario = $tipo_usuario;
        $this->nivel = $nivel;
        $this->usuario = $usuario;
        session_start();
        if ($tipo_usuario == "Alumno" && $nivel==0) {//Usuario alumno
            session_register("autentificado");
            $_SESSION["autentificado"] = "ALUMNO";//Variable de sesion que restringe el acceso
            $_SESSION["alumno"] = $usuario;//Variable de sesion con el usuario 
            $_SESSION["acceso"] = date("Y-n-j H:i:s");//Variable de sesion del tiempo de inicio
        } elseif ($tipo_usuario == "Empleado" && $nivel == 1) {//Verifica el empleado y su puesto, depende del nivel que se le de puede ser 1,2,3 ó los niveles que se quieran manejar
            session_register("autentificado");
            $_SESSION["autentificado"] = "ADMINISTRADOR";
            $_SESSION["administrador"] = $usuario;
            $_SESSION["acceso"] = date("Y-n-j H:i:s");
        } elseif ($tipo_usuario == "Empleado" && $nivel == 2) {
            session_register("autentificado");
            $_SESSION["autentificado"] = "DOCENTE";
            $_SESSION["docente"] = $usuario;
            $_SESSION["acceso"] = date("Y-n-j H:i:s");
        }
    }
    private function imprime($tipo_usuario, $nivel)//Imprime las variable de sesion del usuario
    {
        $this->tipo_usuario = $tipo_usuario;
        $this->nivel = $nivel;
        session_start();
        session_register('autentificado');
        if ($tipo_usuario == "Alumno" && $nivel==0) {
            $sesion = $_SESSION["alumno"];
            return $sesion;
        } elseif ($tipo_usuario == "Empleado" && $nivel == 1) {
            $sesion = $_SESSION["administrador"];
            return $sesion;
        } elseif ($tipo_usuario == "Empleado" && $nivel == 2) {
            $sesion = $_SESSION["docente"];
            return $sesion;
        }
    }
    public function proteger_administrador()//Protege la parte del administrador
    {        
        session_start();
        if ($_SESSION["autentificado"] == "ADMINISTRADOR") {//Verifica que la sesion este creada
            return $this->imprime("Empleado", 1);            
        } else {
            header("Location: index.php");
        }
    }
    public function proteger_docente()//Protege la parte del docente
    {
        session_start();
        if ($_SESSION["autentificado"] == "DOCENTE") {
            return $this->imprime("Empleado", 2);//Imprime las variables de sesion
        } else {
            header("Location: index.php");
        }
    }
    public function proteger_alumno()//Protege la parte del docente
    {
        session_start();
        if ($_SESSION["autentificado"] == "ALUMNO") {
            return $this->imprime("alumno", 0);//Imprime las variables de sesion
        } else {
            header("Location: index.php");
        }
    }
    public function cerrar_sesion_inactiva()//Cierra la sesion si el usuario esta inactivo
    {
        $fechaGuardada = $_SESSION["acceso"];//Variable de sesion del tiempo transcurrido
        $ahora = date("Y-n-j H:i:s");//Variable que captura el tiempo actual
        $tiempo_transcurrido = (strtotime($ahora) - strtotime($fechaGuardada));//Se compara el ultimo tiempo de la sesion del tiempo y la compara con la variable del tiempo transcurrido
        if ($tiempo_transcurrido > 900) {//Tiempo de vida de la sesion
            session_destroy();
        } else {
            $_SESSION["acceso"] = $ahora;//Refresca la variable de sesion del tiempo
        }
    }
    public function cerrar_session()//Cierra la sesion
    {
        session_start();
        $_SESSION = array();
        session_destroy();
        header("Location: index.php");
    }
}
?>
Yo la aplique de la se siguiente manera

index.php
Código:
<form name="forma" method="post" action="index1.php">
<table>
<tr>
<td class="titulos">Tipo de Usuario</td>
<td>
<select name="tipo_usuario" style="width: auto;">
<option value="1">Selecciona</option>
<option value="Empleado">Empleado</option>
<option value="Alumno">Alumno</option>
</select>
</td>
</tr>
<tr>
<td class="titulos">Usuario</td>
<td><input type="text" name="usuario" id="usuario" maxlength="15" size="15" /></td>
</tr>
<tr>
<td class="titulos">Password</td>
<td><input type="password" name="password" id="password" maxlength="10" size="10" /></td>
</tr>
<tr class="titulos">
<td colspan="2"><input type="submit" name="Entrar"  value="Entrar" class="btn btnadmin" /></td>
</tr>
</table>
</form>
index1.php
Código:
<?php
include ("clases/Cargar_clases.php");

$tipo_usuario = $_POST["tipo_usuario"];
$usuario = $_POST["usuario"];
$password = $_POST["password"];

$login = new Login();
$rs = $login->comprueba($usuario, $password, $tipo_usuario);
$row = $rs->fetch_assoc();

if ($tipo_usuario == "Empleado") {
    $usuario1 = $row["id_empleado"];
    $password1 = $row["password"];
    $nivel = $row["nivel"];
    $status=$row["status"];
    if ($usuario == $usuario1 && $password == $password1 && $nivel == 1 && $status==1) {//Verifica que el usuario sea el administrador
        $login->crear_sesion($tipo_usuario, $nivel, $usuario);
        header("Location: administrador.php");
    } elseif ($usuario == $usuario1 && $password == $password1 && $nivel == 2 && $status==1) {//verifica que el usuario sea el docente
        $login->crear_sesion($tipo_usuario, $nivel, $usuario);
        header("Location: docente.php");
    } else {
        header("Location: index.php");
    }
}elseif($tipo_usuario=="Alumno"){
    $usuario1 = $row["id_alumno"];
    $password1 = $row["password"];
    $nivel = 0;
    $status=$row["status"];
    if ($usuario == $usuario1 && $password == $password1 && $nivel == 0 && $status==1) {//Verifica que el usuario sea el alumno
        $login->crear_sesion($tipo_usuario, $nivel, $usuario);
        header("Location: alumno.php");
    } else {
        header("Location: index.php");
    }
} else {
    header("Location: index.php");
}
?>
Proteccion de las pagina por niveles

administrador.php
Código:
<?php
include("clases/Cargar_clases.php");
$login=new Login();
$login->proteger_administrador();
$login->cerrar_sesion_inactiva();
?>
docente.php
Código:
<?php
include("clases/Cargar_clases.php");
$login=new Login();
$login->proteger_docente();
$login->cerrar_sesion_inactiva();
?>
alumno.php
Código:
<?php
include("clases/Cargar_clases.php");
$login=new Login();
$login->proteger_alumno();
$login->cerrar_sesion_inactiva();
?>
BD
Código PHP:
CREATE TABLE `alumnos` (
  `
id_alumnovarchar(15NOT NULL,
  `
nombrevarchar(30NOT NULL,
  `
status`int(1NOT NULL,
   `
passwordvarchar(10NOT NULL,
  
PRIMARY KEY  (`id_alumno`),
ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `empleados` (
  `
id_empleadovarchar(15NOT NULL,
  `
nombrevarchar(30NOT NULL,
  `
status`int(1NOT NULL,
   `
passwordvarchar(10NOT NULL,
   `
nivelvarchar(15NOT NULL,
  
PRIMARY KEY  (`id_empleado`),
ENGINE=InnoDB DEFAULT CHARSET=utf8
Espero que alguien le sirva

Última edición por negro1985; 12/06/2010 a las 20:06
  #2 (permalink)  
Antiguo 09/06/2010, 10:16
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Clase login terminada

Puedes leer un poco sobre el strategy pattern, ya que en lugar de tener varios métodos proteger_administrador etc. hace más sencillo si haces flexible eso, así el mantenimiento es mucho más flexible, por ejemplo:
Código PHP:
Ver original
  1. class TiposUsuarios
  2. {
  3.           const ADMINISTRADOR = 'Administrador';
  4.           const DOCENTE = 'Docente';
  5.           const ALUMNO = 'Alumno';
  6. }
  7.  
  8. class Login
  9. {
  10.          public function __call($method, $args)
  11.          {
  12.                   if (substr($method, 0, 8) == 'proteger') {
  13.                             $this->_proteger(substr($method, 8));
  14.                   }
  15.          }
  16.  
  17.          private function _proteger($nivel)
  18.          {
  19.                  session_start();
  20.                  if (!empty($_SESSION['autentificado']) {
  21.                          $r = new ReflectionClass('TiposUsuarios');
  22.                          $constants = $r->getConstants();
  23.                          if (in_array($_SESSION['autentificado'], array_keys($constants)) {
  24.                                  return $this->imprime($constants[$_SESSION['autentificado']));
  25.                          } else {
  26.                                  header("Location: index.php");
  27.                          }
  28.                  } else {
  29.                          header("Location: index.php");
  30.                  }
  31.          }
  32. }

El uso es mas o menos similar, solo que llamas a los métodos y el __call los atrapa, por ejemplo:
Código PHP:
Ver original
  1. <?php
  2. include("clases/Cargar_clases.php");
  3. $login=new Login();
  4. $login->protegerAdministrador();
  5. // o
  6. $login->protegerDocente();
  7. $login->cerrar_sesion_inactiva();

El __call atrapa el tipo y lo pasa a _proteger que es la que hace el trabajo.

La ventaja de hacerlo así es que agregar nuevos tipos de usuarios es mucho más flexible ya que editas la clase TiposUsuarios y agregas los permisos necesarios, te ayuda mucho a la larga en cuanto al mantenimiento.

Saludos.
  #3 (permalink)  
Antiguo 10/06/2010, 07:53
 
Fecha de Ingreso: febrero-2009
Ubicación: mexico
Mensajes: 148
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Clase login terminada

Gracias por el consejo, voy a intentar hacerlo de esta forma ya que se ve de manera mas limpa el codigo
  #4 (permalink)  
Antiguo 11/06/2010, 11:26
 
Fecha de Ingreso: enero-2009
Mensajes: 455
Antigüedad: 15 años, 2 meses
Puntos: 11
Respuesta: Clase login terminada

Muy buena clase, vamos a tratar de probarla para ver que tal, gracias por el aporte

Saludos
  #5 (permalink)  
Antiguo 23/08/2010, 10:04
 
Fecha de Ingreso: abril-2010
Mensajes: 151
Antigüedad: 14 años
Puntos: 1
Respuesta: Clase login terminada

y donde esta include ("clases/Cargar_clases.php");
que no lo vi por ningun lado del ejemplo
  #6 (permalink)  
Antiguo 23/08/2010, 22:38
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Clase login terminada

Es solamente un ejemplo, es como si la clase que indicaron está en esa ruta. En otras palabras la instancia esta en un archivo aparte y la clase en otro archivo.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Etiquetas: clase, login
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:08.