La verdad, no es necesario que hagas dos carpetas, sino que con código PHP puedes condicionar lo que quieres mostrar al usuario que ha iniciado sesión. Yo tenía que hacer un sitio con intranet y comencé sin saber nada de PHP al igual que todos los que han seguido el curso (aunque en ese entonces no se había publicado el curso de PHP MySQL), pero nunca lo terminé porque los dueños del sitio se dieron cuenta que la intranet no era necesaria XD. Lo puedes ver
aquí. En ese sitio, condiciono con código PHP a la gente que esta logueada a ver lo que necesitan y los que no están logueados solo verán el contenido general. Por ejemplo, esto hace la página index.php (que muestra las noticias publicadas):
index.php<?php
include_once('Sesiones.php');
session_start(); // Esta debe ser la primera línea del archivo, no <html> ni la declaración de DOCTYPE.
$sesiones = new Sesiones(); // instancia la clase Sesiones. Esta línea debe aparecer, de lo contrario no se podrán utilizar las funciones no estáticas (static) de la clase.
?>
<html>
<head>
</head>
<body>
<?php
if($sesiones->isLoggedIn()): // Muestra el contenido para usuarios registrados y que han iniciado sesión
?>
<!-- CÓDIGO HTML PARA USUARIOS QUE HAN INICIADO SESIÓN -->
<?php
else:
?>
<!-- CÓDIGO HTML QUE MUESTRA EL INICIO DE SESIÓN (Y EN CASO DE SER NECESARIO, EL ENLACE PARA REGISTRARSE) -->
<!-- AQUÍ DEBEN PONER EL CÓDIGO DEL FORMULARIO PARA INICIAR SESIÓN. En mi caso, el formulario llama (en el action) al archivo [B]entrar.php[/B] (que esta más abajo) -->
<?php
endif;
?>
Clase php:
Sesiones.php<?php
class Sesiones {
/*
* Devuelve una instancia de la propia clase.
*/
public static function getSelf() {
return new Sesiones();
}
/*
* Codifica la contraseña que se le pase junto con 3 dígitos verificadores.
*
* @param $pass cadena de texto que representa la contraseña que será codificada.
* @parama $salt cadena de texto de un largo determinado para verificar una contraseña.
*/
public function hashPassword($pass, $salt) {
$pass = $this->makeHash($salt.$this->makeHash($pass));
return $pass;
}
/*
* Crea un código verificador de 3 dígitos único en cada llamada a la función.
*
* @return devuelve una cadena de 3 dígitos.
*/
public function makeSalt() {
$cad = md5(uniqid(rand(), true));
return substr($cad, 0, 3);
}
/* public function makeHast();
* Codifica la contraseña junto con el dígito verificador para ser comparado con el de la base de datos.
*
* @param $pass cadena de texto que representa la contraseña que será codificada.
* @return cadena de texto codificada
*/
public function makeHash($pass) {
return hash('sha256', $pass);
}
/* public function valUsr();
* Valida la sesión de usuario. Esta es la función que crea la sesión y asigna las variables a la supergloblal $_SESSION para que puedan ser utilizadas donde quiera que se haya utilizado la función session_start().
* @param $apodo nombre de usuario utilizado en la sesión.
* @param $tipo (opcional) utilizado para reconocer privilegios.
* @param $recordar define el tiempo que durará la sesión.
*/
public function valUsr($apodo, $tipo = '', $recordar) {
if(!isset($_SESSION['valid']))
$_SESSION['valid'] = 1;
if(!isset($_SESSION['usrId']))
$_SESSION['usrId'] = $apodo;
if(!isset($_SESSION['tipo']))
$_SESSION['tipo'] = $tipo;
if($recordar == 'on') { // Si la casilla recordar esta marcada, entonces la sesión no caduca...
session_set_cookie_params(0);
}
else { // de lo contrario se da un tiempo de 1 hora
session_set_cookie_params(time() + (60 * 60));
}
session_regenerate_id();
}
/* public function isLoggedIn()
* Verifica si el usuario a iniciado sesión.
*
* @return true si ha iniciado sesión y false en caso contrario.
*/
public function isLoggedIn() {
if(isset($_SESSION['valid']))
if($_SESSION['valid'] == 1)
return true;
return false;
}
/* public function getType()
* Devuelve el tipo de privilegios del usuario que ha iniciado sesión.
*
* @return 0 si el tipo es administrador, 1 si tiene privilegios generales y -1 en caso de ser desconocido.
*/
public function getType() {
if($_SESSION['tipo'] == 'administrador')
return 0;
else if($_SESSION['tipo'] == 'usuario')
return 1;
return -1;
}
/* public function salir()
* Destruye la sesión actual. Se utiliza al cerrar la sesión.
*/
public function salir() {
$_SESSION = array();
session_destroy();
}
/* public static function encode_str()
* Codifica una cadena en base 64.
*
* @param $str cadena de texto que será codificada.
* @return 0 si la cadena de texto pasada esta vacía, de lo contrario devuelve la cadena cofificada.
*/
public static function encode_str($str) {
if(!isset($str)) {
print 'No se ha especificado información válida.';
return 0;
}
return base64_encode($str);
}
/* public static function decode_str()
* Decodifica una cadena codificada en base 64.
*
* @param $str cadena de texto que será decodificada.
* @return 0 si la cadena esta vacía, de lo contrario devuelve la cadena decodificada.
*/
public static function decode_str($str) {
if(!isset($str)) {
print 'No se ha especificado información válida.';
return 0;
}
return base64_decode($str);
}
}
?>
Para iniciar la sesión, hay que crear un formulario para que llame a un archivo que comience la sesión. En mi caso, este archivo se llama entrar.php, pero se puede llamar como sea, mientras lo especifiquen en el action del formulario:
entrar.php<?php
session_start();
include_once('Sesiones.php'); // incluye el archivo Sesiones.php
//get_files('Sesiones.php,UrlHandling.php,Conexion.php'); // Ignorar esta línea.
$usuario = $_POST['apodo']; // Recibe el nombre de usuario desde el formulario a través de POST.
$clave = $_POST['pass']; // Recibe la contraseña desde el formulario a través de POST.
/* Pregunta si $_POST['remember'] tiene algo (esta es la casilla que recuerda la sesión). Si esta activa, esta valdrá On, de lo contrario estará vacía (por lo que el else es inútil jajajajjaja) */
if(isset($_POST['remember']))
$recordar = $_POST['remember'];
else
$recordar = 'off';
//$pag = UrlHandling::clear_url($_SESSION['last']); // Ignorar esta línea por ahora
//$conexion = new Conexion(); // Instancia una clase creada por mí (utilizada para crear la conexión a la base de datos y generar consultas sql). Por ahora ignorenla.
$con = mysql_connect('localhost', 'usuario_base_datos', 'contraseña_base_datos');
mysql_select_db('base_datos', $con); // la conexion ($con en este caso) creo que es opcional.
//$con = $conexion->getConnection(); // Ignorar
//$usuario = $conexion->escape($usuario); // esto llama a mysql_escape(); lo mismo que la siguiente línea.
$usuario = mysql_escape($usuario); // Prepara la cadena para ser insertada en la BD.
//$clave = $conexion->escape($clave);
$clave = mysql_escape($clave);
$usuario = strtolower($usuario); // Convierte los caracteres a minúsculas para hacer las comparaciones.
$campos = "password, salt, tipo"; // El campo salt y tipo probablemente no estará en su base de datos, por lo que debes borrarlo, quedando así $campos = "password";
$tabla = "usuario"; // Tabla en la base de datos desde donde se extraerán los datos (debes cambiarla por la tuya).
$condicion = "WHERE apodo='" .$usuario. "'"; // $condicion es la condición de comparación en la base de datos.
$result = mysql_query('SELECT '.$campos.' FROM '.$tabla.' '.$condicion, $con);
/* Si no hay al menos 1 (en realidad debería haber solo una fila si es que la base de datos está bien diseñada) fila, entonces se equivocó de usuario o simplemente no existe y muestra un mensaje */
if(mysql_num_rows($result) < 1) {
mysql_free_result($result); // libera recursos
mysql_close($con); // cierra la conexión
$msg = Sesiones::encode_str('Usuario desconocido'); // Codifica el mensaje. Esto lo utilizo porque es enviado a través de GET y debería impedir la inyección de código (eso creo).
header('Location: ' .$pag. '?msg=' .$msg); // Se redirige a la página $pag con el mensaje que le pases.
}
else {
/* mysql_fetch_array($result, MYSQL_ASSOC) devuelve un arreglo con parejas clave valor. Esto quiere decir que devolverá un arreglo que tendrá un índice para el nombre de la columna el cual contendrá el valor de dicha columna. */
$userData = mysql_fetch_array($result, MYSQL_ASSOC);
$sesiones = new Sesiones(); // Instancia la clase Sesiones para poder utilizar los métodos no estáticos (el método encode_str anteriormente utilizado es estático (static)).
//$hash = $sesiones->makeHash($userData['salt'].$sesiones->makeHash($clave)); // Esto no creo que les sea útil, así que ignorenlo.
// Comparamos la contraseña extraida desde la base de datos con la ingresada por el usuario:
if($clave != $userData['password']) { // si no coinciden se devuelve a la página $pag mostrando el mensaje que se especifique en la variable $msg.
mysql_free_result($result);
mysql_close($con);
$msg = Sesiones::encode_str('Contraseña incorrecta.');
header('Location: ' .$pag. '?msg=' .$msg);
}
else { // Si llegamos hasta aquí es porque el usuario existe y la contraseña coincide.
$sesiones->valUsr($usuario, '', $recordar); // Inicia la sesión con el usuario ingresado, el tipo indicado (se puede ignorar) y el tiempo que durará la sesión ($recordar).
mysql_free_result($result);
mysql_close($con);
header('Location: ' .$pag); // Redirige a la página que ustedes indiquen.
}
}
?>
Por si acaso, como este sitio tenía una intranet, los usuarios no se podían registrar a su antojo, sino que había un administrador inicial (que a todo esto, el nombre de usuario es
admin y la contraseña es
123456) que podía crear usuarios con privilegios de administrador o sin privilegios.
Revisa el código y la página para que veas lo que hace. Probablemente tengas muchas dudas, así que pregunta no más.
Saludos.