Inicio de Sesión seguro y Registro de Usuarios usando PHP, MySQLi, jQuery y Bootstrap

Compartir

inicio_sesion_seguro

En este tutorial vamos a ver un simple registro de usuarios e  inicio de sesión con la opción de restablecer la contraseña en caso de que el usuario la haya olvidado, usaremos programación orientada a objetos con PHP5, MySQLi, jQuery y Bootstrap. Además el sistema incluye una serie de plantillas para mostrar después que el usuario haya iniciado sesión, dichas páginas son (home.php, info.php, header.php, footer.php y account.php).

Paso 1:

Crear la base de datos y la tabla de ejemplo para este tutorial con la siguientes consultas:

--
-- Database: `login`
--
CREATE DATABASE IF NOT EXISTS `login` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `login`;
-- --------------------------------------------------------
--
-- Table structure for table `users`
--
CREATE TABLE IF NOT EXISTS `users` (
  `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(60) NOT NULL,
  `password` varchar(60) NOT NULL,
  `social_id` varchar(100) NOT NULL,
  `picture` varchar(250) NOT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`),
  KEY `email` (`email`),
  KEY `login` (`password`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Paso 2:

Crear archivo config.php y definir información de configuración generales relacionados en el mismo.

<?php
require_once 'messages.php';

define( 'BASE_PATH', 'http://localhost/login/');//Ruta base donde se encuentra define( 'DB_HOST', 'localhost' );//Servidor de la base de datos define( 'DB_USERNAME', 'root');//Usuario de la base de datos define( 'DB_PASSWORD', 'root');//Contraseña de la base de datos define( 'DB_NAME', 'login');//Nombre de la base de datos

function __autoload($class) { $parts = explode('_', $class); $path = implode(DIRECTORY_SEPARATOR,$parts); require_once $path . '.php'; }

En donde __autoload() es una de las mágicas funciones de PHP5. Si quieres usar las mismas clases en otros archivos php,  debes incluir el archivo de la clase usando  require_once o include_once para usar las funciones de esa clase.

Ahora crear el archivo messages.php, que tendrá todos los mensaje de éxito así como de error.

<?php
define('FIELDS_MISSING', 'Algunos campos faltan');
define('PASSWORD_NOT_MATCH', 'Las contraseñas no coinciden');
define('USER_REGISTRATION_FAIL', 'Registro de usuarios falló');
define('USER_REGISTRATION_SUCCESS', 'Registro de usuario se ha realizado correctamente , puede iniciar sesión ahora');

define('LOGIN_FIELDS_MISSING', 'Correo electrónico y contraseña faltan'); define('LOGIN_FAIL', 'Correo electrónico y/o Contraseña no coinciden');

define('PASSOWRD_CHANAGE_SUCCESS', 'Contraseña cambiada con éxito.');

Ahora cree DBclass.php y crear DBclass en ella.

<?php
class Cl_DBclass
{
	/**
	 * @var $con llevará a cabo la conexión de base de datos
	 */
	public $con;

/** * Esto creará la conexión de base de datos */ public function __construct() { $this->con = mysqli_connect(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME); if( mysqli_connect_error()) echo "Falló conexión a MySQL: " . mysqli_connect_error(); } }

Paso 3:

Crear archivo User.php, que va a manejar todos las funcionalidades lógicas. mientras va a guardar los datos en la base de datos que es valida los datos, una vez que pasen validación entonces guarda los datos enviados a la base de datos. Si falla la validación que entonces envía  la Excepción de error.

<?php
class Cl_User
{
	/**
	 * @var va a contener la conexión de base de datos
	 */
	protected $_con;

/** * Inializar DBclass */ public function __construct() { $db = new Cl_DBclass(); $this->_con = $db->con; }

/** * Registro de usuarios * @param array $data */ public function registration( array $data ) { if( !empty( $data ) ){

// Trim todos los datos entrantes: $trimmed_data = array_map('trim', $data);

// escapar de las variables para la seguridad $name = mysqli_real_escape_string( $this->_con, $trimmed_data['name'] ); $password = mysqli_real_escape_string( $this->_con, $trimmed_data['password'] ); $cpassword = mysqli_real_escape_string( $this->_con, $trimmed_data['confirm_password'] );

// Verifica la direccion de correo electrónico: if (filter_var( $trimmed_data['email'], FILTER_VALIDATE_EMAIL)) { $email = mysqli_real_escape_string( $this->_con, $trimmed_data['email']); } else { throw new Exception( "Por favor, introduce una dirección de correo electrónico válida!" ); }

if((!$name) || (!$email) || (!$password) || (!$cpassword) ) { throw new Exception( FIELDS_MISSING ); } if ($password !== $cpassword) { throw new Exception( PASSWORD_NOT_MATCH ); } $password = md5( $password ); $query = "INSERT INTO users (user_id, name, email, password, created) VALUES (NULL, '$name', '$email', '$password', CURRENT_TIMESTAMP)"; if(mysqli_query($this->_con, $query)){ mysqli_close($this->_con); return true; }; } else{ throw new Exception( USER_REGISTRATION_FAIL ); } } /** * Este metodo para iniciar sesión * @param array $data * @return retorna falso o verdadero */ public function login( array $data ) { $_SESSION['logged_in'] = false; if( !empty( $data ) ){

// Trim todos los datos entrantes: $trimmed_data = array_map('trim', $data);

// escapar de las variables para la seguridad $email = mysqli_real_escape_string( $this->_con, $trimmed_data['email'] ); $password = mysqli_real_escape_string( $this->_con, $trimmed_data['password'] );

if((!$email) || (!$password) ) { throw new Exception( LOGIN_FIELDS_MISSING ); } $password = md5( $password ); $query = "SELECT user_id, name, email, created FROM users where email = '$email' and password = '$password' "; $result = mysqli_query($this->_con, $query); $data = mysqli_fetch_assoc($result); $count = mysqli_num_rows($result); mysqli_close($this->_con); if( $count == 1){ $_SESSION = $data; $_SESSION['logged_in'] = true; return true; }else{ throw new Exception( LOGIN_FAIL ); } } else{ throw new Exception( LOGIN_FIELDS_MISSING ); } }

/** * El siguiente metodo para verificar los datos de la cuenta para el cambio de contraseña * @param array $data * @throws Exception * @return boolean */

public function account( array $data ) { if( !empty( $data ) ){ // Trim todos los datos entrantes: $trimmed_data = array_map('trim', $data);

// escapar de las variables para la seguridad $password = mysqli_real_escape_string( $this->_con, $trimmed_data['password'] ); $cpassword = $trimmed_data['confirm_password']; $user_id = mysqli_real_escape_string( $this->_con, $trimmed_data['user_id'] );

if((!$password) || (!$cpassword) ) { throw new Exception( FIELDS_MISSING ); } if ($password !== $cpassword) { throw new Exception( PASSWORD_NOT_MATCH ); } $password = md5( $password ); $query = "UPDATE users SET password = '$password' WHERE user_id = '$user_id'"; if(mysqli_query($this->_con, $query)){ mysqli_close($this->_con); return true; } } else{ throw new Exception( FIELDS_MISSING ); } }

/** * Este metodo para cerrar las sesión */ public function logout() { session_unset(); session_destroy(); header('Location: index.php'); }

/** * Esto restablece la contraseña actual y la nueva contraseña para enviar correo * @param array $data * @throws Exception * @return boolean */ public function forgetPassword( array $data ) { if( !empty( $data ) ){

// escapar de las variables para la seguridad $email = mysqli_real_escape_string( $this->_con, trim( $data['email'] ) );

if((!$email) ) { throw new Exception( FIELDS_MISSING ); } $password = $this->randomPassword(); $password1 = md5( $password ); $query = "UPDATE users SET password = '$password1' WHERE email = '$email'"; if(mysqli_query($this->_con, $query)){ mysqli_close($this->_con); $to = $email; $subject = "Nueva solicitud de contraseña"; $txt = "Su nueva contraseña ".$password; $headers = "From: admin@obedalvarado.pw" . "rn" . "CC: admin@obedalvarado.pw";

mail($to,$subject,$txt,$headers); return true; } } else{ throw new Exception( FIELDS_MISSING ); } }

/** * Esto generará una contraseña aleatoria * @return string */

private function randomPassword() { $alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789"; $pass = array(); //recuerde que debe declarar $pass como un array $alphaLength = strlen($alphabet) - 1; //poner la longitud -1 en caché for ($i = 0; $i < 8; $i++) { $n = rand(0, $alphaLength); $pass[] = $alphabet[$n]; } return implode($pass); //convertir el array en una cadena } }

Bueno esa sería la configuración básica para hacer funcionar el Script de Registro de Usuarios a la Base de Datos e Inicio de Sesión al Sistema.

 Descargar archivos

Obed Alvarado

Sobre el autor

Artículo redactado por Obed Alvarado. Comparto experiencias prácticas sobre PHP, MySQL, aplicaciones web, instalación en hosting y herramientas para negocios.

Comentarios