[TUTORIAL] Crear un sistema de usuarios básico completo

eZakto

Member
Messages
782
Reaction score
1
Points
18
Al ver muchas dudas de lo mismo en otros foros, supongo que quizá ayude a alguien aquí ;)

Registro de Usuarios / Login con php.

Vemos en muchos portales, foros, blogs, etc. lo mismo: Registro y login de usuarios, ¿y a quién no se le ha cruzado la idea de implementar eso en su web? Cuando no utilizamos un CMS, tenemos que buscar/programar nuestro propio sistema de usuarios, cosa que a pesar de parecerlo, no es difícil.

Comenzando...
Primero debemos saber qué datos necesitará nuestro usuario para registrarse. Lo más usual es nombre de usuario, contraseña y mail. Comenzaremos creando una base de datos MySQL (O usando una que tengamos creada ya, a gusto) y añadiendo una nueva tabla, que llamaremos sys_users. La tabla tendrá 4 campos: id, user, pass, mail. Donde id será int(32), y el resto tinytext. Puedes crearla manualmente ó automáticamente ejecutando la siguiente sentencia sql:
Code:
CREATE  TABLE `sys_users` ( `id` INT( 32  )  UNSIGNED NOT  NULL  AUTO_INCREMENT  PRIMARY  KEY ,
 `user` TINYTEXT NOT  NULL ,
 `pass` TINYTEXT NOT  NULL ,
 `mail` TINYTEXT NOT  NULL 
) ENGINE  =  MYISAM
Bien. Eso habrá creado una tabla con los 4 campos, asignando al campo id como campo primario y de auto-incremento (Es decir, no será necesario especificar un valor para este campo por cada usuario, se asignará solo).

El formulario
Ya teniendo la tabla en nuestra base de datos, es necesario hacer el formulario por el cual los usuarios ingresarán sus datos para registrarse, para luego insertarlos. Esta es la parte más sencilla. Haremos un formulario que envíe los datos a reg.php por medio del método POST, y que conste de 4 campos: Usuario, contraseña, confirmar contraseña, mail.
HTML:
<form method="post" action="reg.php">
  Usuario:<br />
  <input type="text" name="r_user" /><br />
  Contraseña:<br />
  <input type="password" name="r_pass" /><br />
  Confirmar contraseña:<br />
  <input type="password" name="r_pass_c" /><br />
  Mail:<br />
  <input type="text" name="r_mail" /><br />
  <br />
  <input type="submit" value="Registrarse" />
</form>
Hay que prestar atención al nombre de cada campo (El atributo 'name'), porque ese será el nombre del elemento cuando lo manipulemos con php. Bien, ahora pasamos al código php.

El archivo reg.php
Este archivo, al que se le enviarán las variables, constará de 3 partes: Comprobación, ejecución y confirmación (Que lindo ha quedado :p ). En la primera parte, nos aseguraremos de que se compruebe que los datos son correctos, en la segunda, añadiremos los usuarios a la base de datos, y en la tercera mostraremos el mensaje de éxito.
Comenzamos con la comprobación:
PHP:
<?php
// Primero, transformamos los datos recibidos en entidades html para evitar inyecciones sql
$r_user = htmlentities($_POST['r_user'], ENT_QUOTES);
$r_pass = htmlentities($_POST['r_pass'], ENT_QUOTES);
$r_pass_c = htmlentities($_POST['r_pass_c'], ENT_QUOTES);
$r_mail = htmlentities($_POST['r_mail'], ENT_QUOTES);

// Comprobamos que se haya escrito un nombre de usuario
if($r_user != "") {
  // Ahora comprobamos lo mismo para el mail
  if($r_mail != "") {
    // Para la contraseña... {
    if($r_pass != "") {
      // Bien, ahora comprobaremos que las 2 contraseñas escritas sean iguales:
      if($r_pass === $r_pass_c) {
        /* Todo comprobado. Aquí irá el código de ejecución.
        Pero antes, cerraremos los ifs con el mensaje de error */
      } else {
        echo 'Las contraseñas ingresadas no coinciden.<br /><a href="history.back();return false;"<< Atrás</a>';
      }
    } else {
      echo 'Debes ingresar una contraseña.<br /><a href="history.back();return false;"<< Atrás</a>';
    }
  } else {
    echo 'Debes ingresar una dirección de correo electrónico.<br /><a href="history.back();return false;"<< Atrás</a>';
  }
} else {
  echo 'Debes ingresar un nombre de usuario.<br /><a href="history.back();return false;"<< Atrás</a>';
}
?>
Ahora pasamos al centro de los ifs, donde ha quedado el espacio para la ejecución. Simplemente habrá que ejecutar una sentencia sql y mostrar el mensaje de confirmación. Veamos:
PHP:
<?php
// Primero, transformamos los datos recibidos en entidades html para evitar inyecciones sql
$r_user = htmlentities($_POST['r_user'], ENT_QUOTES);
$r_pass = htmlentities($_POST['r_pass'], ENT_QUOTES);
$r_pass_c = htmlentities($_POST['r_pass_c'], ENT_QUOTES);
$r_mail = htmlentities($_POST['r_mail'], ENT_QUOTES);

// Comprobamos que se haya escrito un nombre de usuario
if($r_user != "") {
  // Ahora comprobamos lo mismo para el mail
  if($r_mail != "") {
    // Para la contraseña... {
    if($r_pass != "") {
      // Bien, ahora comprobaremos que las 2 contraseñas escritas sean iguales:
      if($r_pass === $r_pass_c) {
        // Todo comprobado.
        // Encriptamos la contraseña para alta seguridad:
        $enc_pass = md5($r_pass);
        // Ejecutamos la sentencia
        mysql_query("INSERT INTO sys_users(user,pass,mail) VALUES('{$r_user}','{$enc_pass}','{$r_mail}')");
        // Ahora mostramos la confirmación:
        echo 'Te has registrado con éxito. Ahora puedes iniciar sesión con tu usuario y contraseña';
      } else {
        echo 'Las contraseñas ingresadas no coinciden.<br /><a href="history.back();return false;"<< Atrás</a>';
      }
    } else {
      echo 'Debes ingresar una contraseña.<br /><a href="history.back();return false;"<< Atrás</a>';
    }
  } else {
    echo 'Debes ingresar una dirección de correo electrónico.<br /><a href="history.back();return false;"<< Atrás</a>';
  }
} else {
  echo 'Debes ingresar un nombre de usuario.<br /><a href="history.back();return false;"<< Atrás</a>';
}
?>
Y así es como hemos logrado un sistema simple de usuarios. Claro que se pueden agregar muchas más comprobaciones avanzadas, como comprobar la sintaxis del mail (Que contenga @ y punto, etc), que el usuario/contraseña sea de más de 3 carácteres, que el usuario no exista antes, envío de correo de activación de cuenta y demás. Pero eso será para otro día :p

(Segunda parte abajo)
 
Last edited:

eZakto

Member
Messages
782
Reaction score
1
Points
18
Ahora viene la parte más interesante. Iniciar sesión y proteger páginas. Let's see...

Inicio de sesión
Comenzaremos creando un formulario más simple que el de registro, usuario y contrasela. Que envíe los datos a login.php.
HTML:
<form method="post" action="login.php">
  Usuario:<br />
  <input type="text" name="l_user" /><br />
  Contraseña:<br />
  <input type="password" name="l_pass" /><br />
  <br />
  <input type="submit" value="Iniciar sesión" />
</form>
Fácil, ¿no? Bien, ahora el archivo login.php:

PHP:
<?php
// Primero, transformamos los datos recibidos en entidades html para evitar inyecciones sql
$l_user = htmlentities($_POST['l_user'], ENT_QUOTES);
$l_pass = htmlentities($_POST['l_pass'], ENT_QUOTES);
// Ahora creamos una sentencia sql en busca del usuario ingresado:
$select = mysql_query("SELECT * FROM sys_users WHERE user='{$l_user}'");
// Ahora comprobamos que el usuario exista.
if(mysql_num_rows($select) != 0) {
  // Bien, ahora que sabemos que existe, creamos un bucle para obtener los datos...
  while($row = mysql_fetch_array($select)) {
    /* Ahora con los datos obtenidos, comprobamos que la contraseña sea correcta.
    Hay que recordar que la contraseña guardada está encriptada y no se puede desencriptar.
    Para hacer la comprobación, encriptamos la nueva contraseña y la comparamos con la guardada */
    if(md5($l_pass) == $row['pass']) {
      // En caso de que esté correcto, establecemos la sesión como iniciada. Para ello, usamos cookies.
      setcookie('session', md5($row['user'] . $row['pass']), time()+3600);
      // También creamos una cookie con la id del usuario...
      setcookie('session_id', $row['id'], time()+3600);
      // El contenido de la cookie es usuario+contraseña encriptados, y durará una hora.
      // Ahora cerramos los ifs, con sus respectivos mensajes opuestos.
    } else {
      echo 'Usuario encontrado, pero la contraseña es incorrecta.<br /><a href="history.back();return false;"<< Atrás</a>';
    }
    // La siguiente llave cierra el bucle while, no necesita else.
  }
} else {
  echo 'El usuario no existe.<br /><a href="history.back();return false;"<< Atrás</a>';
}
?>
Ya tenemos nuestro login. ¿Qué más? Listo, esto está terminado...
No molesten...
Dije que no...
Ok, hagamos el logout para completar esto.

Cerrar sesión
Para cerrar la sesión, simplemente nos aseguramos de que las cookies que hemos insertado hayan caducado. Para esto, las "sobreescribimos" y modificamos su fecha límite a una fecha pasada. Bastará con un enlace al archivo logout.php para esto.
logout.php:
PHP:
<?php
// Comprobamos que haya alguna sesión iniciada.
if($_COOKIE['session']) {
  // Ahora sobreescribimos las cookies.
  setcookie('session', 'dada', time()-3600);
  setcookie('session_id', 'dada', time()-3600);
  // Mensaje de confirmación.
  echo 'Sesión cerrada exitosamente.';
}?>
El contenido de las cookies modificada no importa, pues se eliminarán instantáneamente.

Bien... Ahora terminamos esto al fin con la función para proteger páginas. La siguiente función php debe ser incluida por las páginas protegidas.
PHP:
<?php
function isonline() {
  // Comprobamos que existan las cookies..
  if($_COOKIE['session'] && $_COOKIE['session_id']) {
    // Transformamos las cookies en entidades html para evitar inyecciones sql
    $session = htmlentities($_COOKIE['session'], ENT_QUOTES);
    $session_id = htmlentities($_COOKIE['session_id'], ENT_QUOTES);
    // Armamos con la id guardada la sentencia sql para buscar el usuario.
    $find = mysql_query("SELECT * FROM sys_users WHERE id='{$session_id}'");
    // Comprobamos que el usuario exista.
    if($mysql_num_rows($find) != 0) {
      // Armamos el bucle para obtener la información del usuario..
      while($row = mysql_fetch_array($find)) {
        // Comprobamos que la cookie 'session' coincida con los datos guardados..
        if(md5($row['user'] . $row['pass']) == $_COOKIE['session']) {
          // Devolvemos true.
          return 1;
        }
      }
    }
  }
}
?>
Ok. Ahora, para proteger una página, debemos llamar la función dentro de una comprobación. Antes de mostrar el contenido oculto, escribimos esto:
PHP:
<?php
if(isonline()) {
?>
Escribimos todo el contenido privado, y finalmente cerramos el if:
PHP:
<?php
}
?>
También podemos agregar un else con un cartel que diga que es necesario iniciar sesión.

Eso es todo, amigos. No he probado nada del tutorial, lo he escrito así simplemente. Si encuentran algún error, agradecería que me lo dijeran ;)
Que quede claro que esto es algo básico y quizá algo inseguro, pero es solamente para que se den una idea, mejorarlo queda en ustedes :p

Saludos.
 
Last edited:

TonnyORG

I Code Things
Community Support
Messages
5,914
Reaction score
16
Points
38
muy buen aporte ^^ se agradece XD
 

Perucho

New Member
Messages
19
Reaction score
0
Points
0
1. Registro de usuarios.

DESCARGAR

Un sistema de usuarios permite ofrecer privilegios a los usuarios de tu web, los cuáles sólo podrán disfrutar al registrarse. Con esto consigues un mayor control sobre tus usuarios y mayor seguridad cuando de subir contenidos a tu web se trata, por ejemplo formularios de envio de noticias, archivos, entre otros.

Este sistema comprueba si el usuario está registrado y si ha iniciado sesión, si todo es correcto se le permite el acceso a la página, en caso contrario se le negará el acceso, para esto sólo debes agregar un código al principio de cada página que desees proteger.

El sistema funciona con 4 archivos que son los siguientes:

- uregistrar.php
- uentrar.php
- ulogin.php
- usalir.php

- uregistrar.php
En esta página se mostrará un formulario al usuario para que pueda registrarse, los datos básicos que se le piden son 3: nick, contraseña y email, a su vez, este archivo guardará la información en la base de datos, con lo que el usuario estará registrado.

- uentrar.php
Aquí se procesará la información de inicio de sesión, se comprobará que el nick exista y que la contraseña sea correcta, si todo salió bien se crearán las cookies (más información de Cookies en Tutoriales) necesarias para mantener identificado al usuario en la web.

- ulogin.php
Este es el archivo más importante y deberá ser incluído dentro de cada página protegida con el siguiente código:

PHP:
<? require 'ulogin.php' ?>

Este archivo comprobará los datos almacenados en las cookies y buscará si estos datos coinciden con los de la base de datos. Si los datos son incorrectos o si por alguna razón has eliminado al usuario de la base de datos, se le negará el acceso al usuario.

- usalir.php
Este archivo elimina las cookies del usuario con lo que queda cerrada la sesión.

Para usar el registro de usuarios es muy sencillo, primero debes crear la tabla "usuarios" en tu base de datos pegando este código en la casilla SQL de tu phpMyAdmin:

Code:
create table usuarios ( 
id smallint(5) unsigned not null auto_increment, 
fecha int(10) unsigned not null, 
nick varchar(20) not null, 
contrasena varchar(32) not null, 
email varchar(40) not null, 
pais varchar(20) not null, 
edad tinyint(2) unsigned not null, 
sexo enum('0','1') not null, 
descripcion tinytext not null, 
web varchar(100) not null, 
ip varchar(15) not null, 
primary key (id), 
key (nick,contrasena) 
)

Después sube los archivos en el directorio raíz de tu web (el directorio raíz es la primer carpeta que se abre cuando accesas a tu web ya sea por FTP o por WebFTP).

Por último, sólo pega el siguiente código en alguna parte de tu web donde deseas que tus usuarios inicien sesión, de preferencia en la página principal:

PHP:
<?
if(!$_COOKIE[uid]) {
?>
<form method="post" action="uentrar.php">
<b>Nick:</b><br>
<input type="text" name="nick" maxlength="20"><br>
<b>Contraseña:</b><br>
<input type="password" name="contrasena" maxlength="20"><br><br>
<input type="submit" name="enviar" value="Iniciar Sesión">
</form>
<p><a href="uregistrar.php">Nuevo usuario</a>
<?
}
else {
?>
Bienvenid@ <b><?=$_COOKIE[unick]?></b><br><br>
<a href="pagina_protegida1.php">Enlace 1</a><br>
<a href="pagina_protegida2.php">Enlace 2</a><br>
<a href="pagina_protegida3.php">Enlace 3</a><br><br>
<a href="usalir.php">Salir</a>
<?
}
?>

Este código mostrará un formulario y un enlace para los usuarios que deseen iniciar sesión o registrarse respectivamente. Si el usuario inicia sesión, automáticamente aparecerá un mensaje de bienvenida con los enlaces a las páginas restringidas sólo para usuarios registrados, es primordial que cada página protegida incluya el archivo ulogin.php tal como se indica más arriba, o cualquier usuario no registrado podrá entrar a estas páginas.

Este tutorial me sirvió mucho para empezar, fue tomado de Electros.Tk :biggrin:
 

gothcrow

New Member
Messages
307
Reaction score
0
Points
0
Gracias!, muy util para implementarlo en webs de modo rapido
 

Kansy

Community Advocate
Community Support
Prime Account
Messages
2,621
Reaction score
9
Points
38
Se merece un sticky.
 

Rey_Lich

New Member
Messages
146
Reaction score
0
Points
0
Mushisimas gracias a los dos (aunque creo que en todo caso uso el de perucho)
 

he_tiiitox

New Member
Messages
2
Reaction score
0
Points
0
MUCHAS GRACIAS POR LA INFORMACION Y LOS ARCHIVOS...... se que hay que ser un tonto para no saber aplicarlos........ pero o soy nuevo en php..... y tengo unas dudas..... todos dicen crear una base de datos.. pero como la creo? como hacer para que eso se conecte a mi base de datos? y que tiene que ver sql? porfavor agregame para que me pudas ayudar xq he tenido muchos problemas y quiero crear uno ya!....
titin7771@hotmail.com

GRACIASA
 

eZakto

Member
Messages
782
Reaction score
1
Points
18
La base de datos se crea con, por ejemplo, phpMyAdmin. SQL es el lenguaje con el que se manejan las bases de datos SQL...

La mayoría de tus preguntas las encontrarás en http://www.php.net/

Saludos.
 

figu120

New Member
Messages
921
Reaction score
0
Points
0
men te prometo qe para mi es muy dificil todo esto y nesecito ayuda detallada porfavor agregame a mi msn.... lo nesecito de verdad titin7771@hotmail.com.
GRACIAS

es dificil Si! pero no imposible
yo te ayudaria pero no tengo mucho tiempo ya q estoy en un proyecto web
seitenweb.com.ar el cual estoy montando info tons me mantengo un poko apretado de timer
 

Zweeden

New Member
Messages
1
Reaction score
0
Points
0
Hola, yo tengo un problema:

Cuando lo hago y pruebo en el servidor de mi máquina (localhost/127.0.0.1) me funciona a la perfección.
Cuando lo pongo en mi servidor FTP, y quiero probar me tira esto cuando intento loguear:
Code:
[B]Warning[/B]:  Cannot modify header information - headers already sent by (output started at /home/av000069/public_html/login.php:3) in [B]/home/av000069/public_html/login.php[/B] on line [B]293[/B]

[B]Warning[/B]:  Cannot modify header information - headers already sent by (output started at /home/av000069/public_html/login.php:3) in [B]/home/av000069/public_html/login.php[/B] on line [B]295[/B]

Me podrían ayudar? es un host pago, de Dattatec.
 

Danfelbm

Member
Messages
364
Reaction score
0
Points
16
ehh! que buen aporte!, me ha funcionado de maravillas!... ¬¬ me daba problemas...
 

eZakto

Member
Messages
782
Reaction score
1
Points
18
Esos errores se deben a que se han enviado headers (o cookies, en este caso) después de haber enviado contenido al navegador.

Igualmente, quiero decir que el tutorial tiene fines didácticos, ya que en verdad es muy inseguro y el código es realmente penoso xD

Saludos.
 

Kansy

Community Advocate
Community Support
Prime Account
Messages
2,621
Reaction score
9
Points
38
Tengo un par de preguntitas.

1. Para mostrar el contenido oculto es ese código. Pero como se podria hacer para que si no esta conectado se muestre por ejemplo, Para ver el contenido debes estar conectado. Conectar | Registrar Y que si esta conectado se vea el contenido oculto?

2. La otra es, como se puede hacer para que cuando se registre se le mande un correo con los datos. Me interesaria saber tambien hacer un correo html. Es decir con sus imagenes y eso.


^^
 

medina

x10 Addict
Community Support
Messages
1,809
Reaction score
6
Points
38
bueno xDDDDDDD...... para las personas q piden ayuda por mail pienso q ni han leido el tutorial y quieren q alguien se los haga, por q esta perfectamente explicado y solo es copiar pegar y listo
 

Kansy

Community Advocate
Community Support
Prime Account
Messages
2,621
Reaction score
9
Points
38
Antes de hablar aprende a enteder tu lo que lees.
 

eZakto

Member
Messages
782
Reaction score
1
Points
18
Tengo un par de preguntitas.

1. Para mostrar el contenido oculto es ese código. Pero como se podria hacer para que si no esta conectado se muestre por ejemplo, Para ver el contenido debes estar conectado. Conectar | Registrar Y que si esta conectado se vea el contenido oculto?
al "if(isonline())" le agregas, después, un else.

2. La otra es, como se puede hacer para que cuando se registre se le mande un correo con los datos. Me interesaria saber tambien hacer un correo html. Es decir con sus imagenes y eso.
Eso es complicado. Básicamente puedes hacerlo con la función mail() (->php.net/mail), pero te recomiendo que busques alguna clase buena, como phpmailer o xpert mailer.

Si me inspiro hago la versión 2.0 del tutorial, y explico como hacer un Sistema de Usuarios Básico Decente xD

Saludos.
 

Kansy

Community Advocate
Community Support
Prime Account
Messages
2,621
Reaction score
9
Points
38
mmm Hablamos por mensaje privado ^^
 

NicKGarY

New Member
Messages
65
Reaction score
0
Points
0
=O q aporta mas bueno... de verdad felicitaciones!!! y que bueno q compartas tus conocimientos con los mas necesitados.. jeje

sigue asi man, aprende y enseña es la mejor forma de continuar aprendiendo... y lo mejor es que personas como nosotros (Yop) nos beneficiamos por eso...

Salu2 y exito...
 
Top