Foros del Web » Programando para Internet » PHP »

PHP OO [APORTE] Clase inicio sesion para cualquier pagina con mysql

Estas en el tema de [APORTE] Clase inicio sesion para cualquier pagina con mysql en el foro de PHP en Foros del Web. Buen día, Dado que he visto muchos mensajes de usuarios que apenas comienzan con PHP acerca de un sistema de inicio de sesión, he decidido ...
  #1 (permalink)  
Antiguo 20/01/2012, 13:44
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 19 años, 6 meses
Puntos: 394
[APORTE] Clase inicio sesion para cualquier pagina con mysql

Buen día,

Dado que he visto muchos mensajes de usuarios que apenas comienzan con PHP acerca de un sistema de inicio de sesión, he decidido crear una pequeña y sencilla clase que puede ser utilizada en cualquier pagina siempre y cuando maneje una base de datos MySQL

NOTAS:
1. Esta clase fue creada en principio como apoyo a la educación así que no es la panacea ni contiene códigos complicados.
2. Esta clase fue creada para ser adaptada a cualquier base de datos siempre y cuando trabajen sobre MySQL y se tenga una tabla donde se almacene el nombre del usuario y la contraseña
2. Es muy sencilla y NO contiene nada de seguridad (REITERO que solo la desarrolle para usuarios que apenas comienzan con PHP) y quieren tener un ejemplo o algo rápido para adaptar a sus paginas personales.
3. Sientanse libres de realizar cualquier modificación al codigo, siempre y cuando coloquen las mejoras en el hilo del tema con su respectiva explicación para que los demás usuarios puedan aprender mas.

MANOS A LA OBRA
Leer documentación dentro de codigo para mayor comprensión...

claseLogueo.php
Código PHP:
Ver original
  1. class loguear{
  2.  
  3. private $user, $pass;
  4.  
  5.     /* PARAMETROS
  6.     *
  7.     ** param $user que es una cadena de texto con el nombre del usuario registrado
  8.     ** param $pass que es una cadena de texto con la contraseña del usuario registrado
  9.     */
  10.     public function __construct($user, $pass){
  11.         $this->user = $user;
  12.         $this->pass = $pass;
  13.     }
  14.    
  15.     /* PARAMETROS
  16.     *
  17.     ** param $servidor es una cadena de texto con la IP o el nombre del servidor
  18.     ** param $usuarioDB es una cadena de texto con el usuario para conectar a la base de datos
  19.     ** param $contraseñaDB es una cadena de texto con la contraseña para conectar a la base de datos
  20.     ** param $nombreBD  es una cadena de texto con el nombre de la base de datos
  21.     ** param $CampoTablaUser  es una cadena de texto con el nombre del campo que maneja los usuarios en la tabla de la base de datos
  22.     ** param $CampoTablaPass es una cadena de texto con el nombre del campo que maneja las contraseñas en la tabla de la base de datos
  23.     ** param $tabla es una cadena de texto con el nombre de la tabla que maneja los usuarios registrados de tu pagina
  24.     ** return $resultado que es un array con los resultados de la base de datos
  25.     *
  26.     */
  27.     public function consultaDB($servidor, $usuarioDB, $contraseñaDB, $nombreBD, $CampoTablaUser, $CampoTablaPass, $tabla){
  28.         $conexion = mysql_connect($servidor, $usuarioDB, $contraseñaDB);
  29.         mysql_select_db($nombreBD, $conexion);
  30.         $consulta = "SELECT $CampoTablaUser, $CampoTablaPass FROM $tabla WHERE $CampoTablaUser = '$this->user'";
  31.         echo $consulta;
  32.         $ejecutar = mysql_query($consulta, $this->conexion);
  33.         //$totalRegistros = mysql_num_rows($ejecutar);
  34.        
  35.         while($registros = mysql_fetch_array($ejecutar)){
  36.             $resultado[] = $registros[$CampoTablaUser];
  37.             $resultado[] = $registros[$CampoTablaPass];
  38.         }
  39.         return $resultado;
  40.     }
  41.    
  42.     /* PARAMETROS
  43.     *
  44.     ** param $arrayResultadoConsultaDB es un array con los resultados del metodo anterior
  45.     ** return $retorno que es un boleano (TRUE o FALSE)
  46.     */
  47.     public function verificar($arrayResultadoConsultaDB){
  48.         if(empty($arrayResultadoConsultaDB[0]) || empty($arrayResultadoConsultaDB[1]) || $$arrayResultadoConsultaDB[0] != $this->user || $$arrayResultadoConsultaDB[1] != $this->pass){
  49.             $retorno = FALSE;
  50.             return $retorno;
  51.         }else{
  52.             $_SESSION['logueado'] = TRUE;
  53.             $_SESSION['usuario'] = $$arrayResultadoConsultaDB[0];
  54.             $_SESSION['contrasena'] = $$arrayResultadoConsultaDB[1];
  55.             $retorno = TRUE;
  56.             return $retorno;
  57.         }
  58.     }
  59.    
  60.     /* PARAMETROS
  61.     *
  62.     ** param $tipo es un boleano (1-0)  el cero quiere decir que se quiere mostrar un mensaje, el 1 quiere decir que queremos hacer una redireccion a otra pagina
  63.     ** param $msgRedir es una cadena de texto con el mensaje o la ruta a la pagina que se quiere redirigir
  64.     */
  65.     public function accion($tipo, $msgRedir){
  66.         switch($tipo){
  67.             case 0:
  68.                 echo "$msgRedir";
  69.             break;
  70.             case 1:
  71.                 header("Location:$msgRedir");
  72.             break;
  73.         }
  74.     }
  75. }
  76. ?>

ejemploUso.php
Código PHP:
Ver original
  1. <?php
  2.  
  3. include("claseLogueo.php");
  4.  
  5. /* OBTENIENDO DATOS DE FORMULARIO */
  6. $usuarioFORM = $_POST['usuario']; // cambiar USUARIO por el nombre del campo del formulario donde se escribe el usuario
  7. $contrasenaFORM = $_POST['contrasena']; // cambiar CONTRASENA por el nombre del campo del formulario donde se escribe la contraseña
  8.  
  9. /* INFORMACION DE LA BASE DE DATOS */
  10. $servidor = 'localhost'; // servidor de la base de datos
  11. $usuarioBD = 'root'; // usuario para ingresar a la base de datos
  12. $contraseñaDB = '123456'; // contraseña para ingresar a la base de datos
  13. $nombreDB = 'pruebas'; // nombre de la base de datos
  14. $tabla = 'registro'; // tabla donde se almacenan los usuarios
  15. $campoTablaUser = 'registro_NombreUsuario'; // nombre de la columna donde se almacena el nombre de usuario
  16. $CampoTablaPass = 'registro_NombreContrasena'; // nombre de la columna donde se almacena la contraseña de usuario
  17.  
  18. // COMENZAMOS CON LA CLASE
  19. $clase = new loguear($usuarioFORM, $contrasenaFORM);
  20. $consultando = $clase->consultaDB($servidor, $usuarioBD, $contraseñaDB, $nombreDB, $campoTablaUser, $CampoTablaPass, $tabla);
  21. $estado = $clase->verificar($consultando);
  22.  
  23. // verificamos el resultado del metodo para saber si todo es OK o si no es usuario registrado
  24. if($estado === FALSE){
  25.     echo "El campo usuario y contraseña no coinciden o NO existes en nuestra base de datos";
  26. }else{
  27.     //$mensaje = "Bienvenido, ahora estas logueado";
  28.     $redireccionar = 'unaPagina.php';
  29.     $clase->accion(0, $redireccionar);
  30. }
  31. ?>

Espero que esto le de un punto de partida a los usuarios que están empezando con PHP y a los usuarios que estén comenzando con la POO como yo.

Cualquier comentario (constructivo) o mejora al codigo sera bienvenido.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???

Última edición por jotaincubus; 20/01/2012 a las 13:54
  #2 (permalink)  
Antiguo 20/01/2012, 16:43
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: [APORTE] Clase inicio sesion para cualquier pagina con mysql

de manera educativa y que me corrijan si estoy equivocado una de las cosas que he ido aprendiendo mientras me he adentrado en el POO es la separación de responsabilidades, no es responsabilidad de tu objeto login hacer la conexión con la DB, en el foro hemos hablado un poco de ese tema de clases de conexión que pudieras integrar, incluso metiendote un poco con PDO, para que le pases un objeto de conexión a tu clase y hagas las consultas desde el, si tengo un tiempo me preparo una puede que con tus bases o alguna otra para que me la destruyan (constructivamente ) a ver si he aprendido algo, saludos espero que tomes mi recomendación y si tienes el chance también hagas una mejora
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #3 (permalink)  
Antiguo 20/01/2012, 18:48
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 19 años, 6 meses
Puntos: 394
Respuesta: [APORTE] Clase inicio sesion para cualquier pagina con mysql

Jeje la verdad es que yo manejo PDO y excepciones en mis proyectos... Muchas gracias por tu aporte.

En realidad no quiero colocar ODBC en este caso ya que como dije arriba es una forma de enseñar a los usuarios nuevos en PHP y una forma de ayudar a los que siempre buscan un sistema de logueo sin tener que desarrollarlo ellos mismos.

Ahora bien, si es un usuario "novato" en PHP no me parece justo matarlo colocándole PDO, cuando lo que busco es que ellos lo miren y sepan que realiza la clase.

Hubiese podido utilizar muchisimas cosas como herencias, singleton, seguridad, etc, etc, etc pero no es lo que buscaba en este aporte ya que como te digo he visto muchos mensajes de personas que no quieren o no tienen tiempo para hacer un sistema completo de logueo.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #4 (permalink)  
Antiguo 20/01/2012, 22:16
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 21 años, 3 meses
Puntos: 105
Respuesta: [APORTE] Clase inicio sesion para cualquier pagina con mysql

Holas,

Una consulta @jotaincubus, porque conciderastes loguear como una clase?, podria ser tambien que sea una funcion de una clase por ejemplo Usuario, Cliente, Persona, etc.?

Saludos
__________________
.: Gildus :.
  #5 (permalink)  
Antiguo 21/01/2012, 06:37
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 19 años, 6 meses
Puntos: 394
Respuesta: [APORTE] Clase inicio sesion para cualquier pagina con mysql

Cita:
Iniciado por gildus Ver Mensaje
Holas,

Una consulta @jotaincubus, porque conciderastes loguear como una clase?, podria ser tambien que sea una funcion de una clase por ejemplo Usuario, Cliente, Persona, etc.?

Saludos
Podría ser lo que ustedes quieran, solo lo hice para que las personas lo puedan usar. Si quieren podrían unirlo todo en una simple función y también funcionaria.

Muchas gracias por tu comentario.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #6 (permalink)  
Antiguo 22/01/2012, 11:57
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: [APORTE] Clase inicio sesion para cualquier pagina con mysql

acá el invento que hice ,
Código PHP:
Ver original
  1. <?php
  2. /**
  3.  *
  4.  * clase para gestionar Usuarios
  5.  * @author Carlos Belisario <carlosbelisario.com>
  6.  * @version 1.0
  7.  *
  8.  */
  9. class Usuarios
  10. {
  11.     /**
  12.      *
  13.      * @var String $usuario
  14.      */
  15.     private $usuario;
  16.    
  17.     /**
  18.      *
  19.      * @var String $password
  20.      */
  21.     private $password;
  22.    
  23.     /**
  24.      *
  25.      * @var String $rol
  26.      */
  27.     private $rol;
  28.    
  29.     /**
  30.      *
  31.      * @var String $estatus
  32.      */
  33.     private $estatus;
  34.    
  35.     /**
  36.      *
  37.      * @var String $securitySalt
  38.      */
  39.     private $securitySalt;
  40.    
  41.     /**
  42.      *
  43.      * @var PDO
  44.      */
  45.     private $db;
  46.    
  47.     /**
  48.      *
  49.      * @var String $error
  50.      */
  51.     private $error;
  52.  
  53.  
  54.     /**
  55.      *
  56.      * @param PDO $db
  57.      */
  58.    
  59.     public function __construct(PDO $db)
  60.     {
  61.         $this->db = $db;
  62.     }
  63.  
  64.         /**
  65.      *
  66.      * Getter and Setter
  67.      */
  68.     public function getUsuario()
  69.     {
  70.         return $this->usuario;
  71.     }
  72.    
  73.     public function setUsuario($usuario)
  74.     {
  75.         $this->usuario = $usuario;
  76.     }
  77.    
  78.     public function getPassword()
  79.     {
  80.         return $this->password;
  81.     }
  82.    
  83.     public function setPassword($password, $salt = true)
  84.     {
  85.         if($salt)
  86.             $this->password = md5($this->getUsuario().$password.$this->getSecuritySalt());
  87.         else
  88.             $this->password = md5($this->getUsuario().$password);
  89.     }
  90.    
  91.     public function getSecuritySalt()
  92.     {
  93.         return $this->securitySalt;
  94.     }
  95.    
  96.     public function setSecuritySalt($securitySalt = 'heyntonwgrnkmoamju33mdowm')
  97.     {
  98.         $this->securitySalt = $securitySalt;
  99.     }
  100.    
  101.     public function getRol()
  102.     {
  103.         return $this->rol;
  104.     }
  105.    
  106.     public function setRol($rol)
  107.     {
  108.         $this->rol = $rol;
  109.     }
  110.    
  111.     public function getEstatus()
  112.     {
  113.         return $this->estatus;
  114.     }
  115.    
  116.     public function setEstatus($estatus)
  117.     {
  118.         $this->estatus = $estatus;        
  119.     }
  120.    
  121.     public function getError()
  122.     {
  123.         return $this->error;
  124.     }
  125.  
  126.     public function setError($k, $error)
  127.     {
  128.         $this->error[$k] = $error;
  129.     }
  130.     /**
  131.      *
  132.      * @method login
  133.      * metodo para autnetificar al usuario
  134.      *
  135.      */
  136.     public function login()
  137.     {
  138.         // aca verificamos que el usuario haya escrito en un formato que comience con letras y pueda estar seguido de un punto, guion bajo o guion
  139.         if(preg_match("/(^[a-z]{1,20})(?!\s)([\w-\.]{0,20}$)/i",  $this->getUsuario())){
  140.             $sql = "SELECT * FROM usuarios WHERE usuario = :usuario AND password = :password";
  141.             try {
  142.                 // hacemos la consulta
  143.                 $query = $this->db->prepare($sql);            
  144.                 $query->bindParam(':usuario', $this->getUsuario());
  145.                 $query->bindParam(':password', $this->getPassword());
  146.                 $query->execute();
  147.                 $row = $query->fetchObject();
  148.                 //verificamos que el usuario exista en la base de datos y la password sea correcta
  149.                 if(!empty($row)) {                                                                                  
  150.                     $this->setRol($row->rol);
  151.                     /*podemos pasar el estatus para que se haga la verificacion
  152.                     * e ingrese a una pagina para usuarios deshabilitados,
  153.                     * para darle motivos e incluso donde comunicarse,
  154.                     *                            
  155.                     */                        
  156.                     $this->setEstatus($row->estatus);
  157.                        
  158.                     /* o podemos incluirlo en los errores, de manera que no haga login
  159.                     if($row->estatus == "habilitado") {
  160.                         $this->setRol($row->rol);                                                                
  161.                     } else {
  162.                         $this->setError ('userEstatus', 'El Usuario no esta habilitado');
  163.                     }*/                          
  164.                    
  165.                 } else {
  166.                     $this->setError('errorLogin', 'El Usuario o la Contraseña no es Correcta');
  167.                 }    
  168.            
  169.              } catch( PDOException $e) {
  170.                  $e->getMessage();
  171.              }                    
  172.         } else {
  173.             $this->setError('erroFormato', 'Formato de usuario no permitido');
  174.         }  
  175.     }
  176. }
  177.  
  178. /**
  179. * como usar
  180. */
  181. try {
  182. //establecemos la conexion con PDO
  183.     $db = new PDO('mysql:host=localhost; dbname=prueba', 'root', '123');  
  184. } catch(PDOException $e) {
  185.    echo $e->getMessage();
  186. }
  187. //instanciamos la clase y probamos el login
  188. $class = new Usuarios($db);
  189. //los parámetros estan siendo pasado un login por defecto se puede obtener desde un formulario con $_POST O $_GET
  190. $class->setUsuario('carlos');
  191. $class->setPassword('123456');
  192. //indicamos que realice el login
  193. $class->login();
  194. //sino existe algn error
  195. if(count($class->getError()) == 0) {
  196.     //realizamos los procesos con las variables de session o incluso si se desea se puede crear un componente de session y le pasamos nuestro objeto usuario con el login correcto
  197. } else {
  198. // gestionamos los mensajes de errores para los usuarios
  199.     echo "<pre>";
  200.     print_r($class->getError());
  201.     echo "</pre>";
  202. }
  203. ?>
es mas como dijo gildus una gestión de usuarios ya que el login es solo una accion que realizan los mismo, no hice la vista solo la lógica del login, todavía me falta crear la gestión de lo que es el CRUD, pero lo hice ahorita porque tenía un tiempo libre, espero que les pueda servir y que las critiquen, si hay dudas, me dicen o mejoras mucho mejor, por cierto por fin me cree una cuenta pública de github pueden descargar directamente de alla si quieren para hacer mejoras como lo deseen, eso si me las indican para ver yo también y aprender, saludos https://github.com/carlosbelisario/juegos_con_clases/
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #7 (permalink)  
Antiguo 22/01/2012, 12:30
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 21 años, 3 meses
Puntos: 105
Respuesta: [APORTE] Clase inicio sesion para cualquier pagina con mysql

esta mejor lo de @carlos_belisario; en si el termino login, creo que lo deberiamos ver mas como una accion de un objeto usuario. Y creo que esta a su vez usaria metodos heredados de una clase por ejemplo usuarioSistema, o usuarioAplicacion, algo como:

Código PHP:
Ver original
  1. class usuario
  2. {
  3.     /* metodos de getter and setter */
  4. }
  5.  
  6.  
  7. class usuarioAplicacion
  8. {
  9. ...
  10.     function login()
  11.     {
  12.        ....
  13.     }
  14. ...
  15. }


Es mas, puede haber mas estructuras de las clases, incluso con lo nuevo de php 5.4 los traits

Saludos
__________________
.: Gildus :.
  #8 (permalink)  
Antiguo 22/01/2012, 12:59
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: [APORTE] Clase inicio sesion para cualquier pagina con mysql

sería interesante ver un ejemplo con traits no los he manejado, voy a ver si estudio un poco de ellos para comprender como funcionan y ver si puedo colocarlo en estas clases para ver si voy aprendiendo un poco más, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way

Etiquetas: clase, logueo, mysql, sesión, sistema, usuarios
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 21:13.