Autor Tema: sesiones de usuarios con php: login de usuarios y redireccionar a distintas web  (Leído 40817 veces)

neosxxx

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Buenas a tod@s, quiero hacer un login de usuarios con diferentes accesos a páginas, es decir si el usuario1 tiene en el campo nivel de la BD un 1 me lleve a volu.php si tiene un 2 a volu5.php....  Tengo lo siguiente:
login.php:

Código: [Seleccionar]
<?php
/*
 * Valida un usuario y contraseña o presenta el formulario para hacer login
 */

if ($_SERVER['REQUEST_METHOD']=='POST') { // ¿Nos mandan datos por el formulario?
    
include('php_lib/config.ini.php'); //incluimos configuración
    
include('php_lib/login.lib.php'); //incluimos las funciones

    //verificamos el usuario y contraseña mandados
    
if (login($_POST['usuario'],$_POST['password'])) {

       
//acciones a realizar cuando un usuario se identifica
       //EJ: almacenar en memoria sus datos, registrar un acceso a una tabla de datos


        //saltamos al inicio del área restringida
        //header('Location: pagina-acceso-restringido.php');
 
//Sentencia SQL para buscar un usuario con esos datos 
$ssql "SELECT * FROM usuarios WHERE nivel='$nivel'"

//Ejecuto la sentencia 
$rs mysql_query($ssql,$link); 

    
    
    if (
mysql_num_rows($rs)!=0){ 

switch($rs)
{
case "1":
header('Location: volu.php');
break;

case "2":
header('Location: volu5.php');
break;

case "3":
header('Location: volu15.php');
break;
default:
        echo "Aun no has puesto el nivel";  

}
}

die();
    } else {
        
//acciones a realizar en un intento fallido
        //Ej: mostrar captcha para evitar ataques fuerza bruta, bloqueas durante un rato esta ip, ....


        //preparamos un mensaje de error y continuamos para mostrar el formulario
        
$mensaje='Usuario o contraseña incorrectos.';
    }
//fin if post
?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>DirecPedidos</title>
    </head>
    <body>
        <h1>DirecPedidos</h1>
        <?php
            
//si hay algún mensaje de error lo mostramos escapando los carácteres html
            
if (!empty($mensaje)) echo('<h2>'.htmlspecialchars($mensaje).'</h2>');
        
?>

        <form action="login.php" enctype="multipart/form-data" method="post">
            <label>Usuario:
                <input name="usuario" type="text" />
            </label>
            <label>Contraseña:
                <input name="password" type="password" />
            </label>
            <input type="submit" value="Entrar" name="submit" />
        </form>
    </body>
</html>


********************************************************************
config.ini.php:

Código: [Seleccionar]
<?php
/* 
 * Configuración general: conexión a la base de datos y otro parámetros
 */

define('SERVIDOR_MYSQL','127.0.0.1'); //servidor de la base de datos
define('USUARIO_MYSQL','user'); //usuario de la base de datos
define('PASSWORD_MYSQL','psss'); //la clave para conectar
define('BASE_DATOS','bd'); // indica el nombre de la base de datos que contiene la tabla de los usuarios

define('TABLA_DATOS_LOGIN','usuarios'); //nombre de la tabla usarios
define('CAMPO_USUARIO_LOGIN','usuario'); //campo que contiene los datos de los usuarios (se puede usar el email)
define('CAMPO_CLAVE_LOGIN','password'); //campo que contiene la contraseña


define('METODO_ENCRIPTACION_CLAVE','texto'); //método utilizado para almacenar la contraseña encriptada. Opciones: sha1, md5, o texto


?>


********************************************************************
login.lib.php:

Código: [Seleccionar]
<?php

 
valida un usuario y contraseña
 
* @param string $usuario
 
* @param string $password
 
* @return bool
 
*/
function 
login($usuario,$password) {

    
//usuario y password tienen datos?
    
if (empty($usuario)) return false;
    if (empty (
$password)) return false;

    
//1 - conectamos a la base de datos utilizando los parámetros globales
    
$link =  mysql_connect(SERVIDOR_MYSQLUSUARIO_MYSQLPASSWORD_MYSQL);

    if (!
$link) {
        
trigger_error('Error al conectar al servidor mysql: ' mysql_error(),E_USER_ERROR);
    }
    
// Seleccionar la base de datos activa
    
$db_selected mysql_select_db(BASE_DATOS$link);
    if (!
$db_selected) {
        
trigger_error ('Error al conectar a la base de datos: ' mysql_error(),E_USER_ERROR);
    }

    
//2 - preparamos la consulta SQL a ejecutar utilizando sólo el usuario y evitando ataques de inyección SQL.
    
$query='SELECT '.CAMPO_USUARIO_LOGIN.', '.CAMPO_CLAVE_LOGIN.' FROM '.TABLA_DATOS_LOGIN.' WHERE '.CAMPO_USUARIO_LOGIN.'="'.  mysql_real_escape_string($usuario).'" LIMIT 1 '//la tabla y el campo se definen en los parametros globales
    
$result mysql_query($query);
    if (!
$result) {
        
trigger_error('Error al ejecutar la consulta SQL: ' mysql_error(),E_USER_ERROR);
    }


    
//3 - extraemos el registro de este usuario
    
$row mysql_fetch_assoc($result);

    
    
    if (
$row) {
        
//4 - Generamos el hash de la contraseña encriptada para comparar o lo dejamos como texto plano
        
switch (METODO_ENCRIPTACION_CLAVE) {
            case 
'sha1'|'SHA1':
                
$hash=sha1($password);
                break;
            case 
'md5'|'MD5':
                
$hash=md5($password);
                break;
            case 
'texto'|'TEXTO':
                
$hash=$password;
                break;
            default:
                
trigger_error('El valor de la constante METODO_ENCRIPTACION_CLAVE no es válido. Utiliza MD5 o SHA1 o TEXTO',E_USER_ERROR);
        }

     
//   var_dump($row);
       // var_dump($hash);
        //5 - comprobamos la contraseña
        
if ($hash==$row[CAMPO_CLAVE_LOGIN]) {
            @
session_start();
            
$_SESSION['USUARIO']=array('user'=>$row[CAMPO_USUARIO_LOGIN]); //almacenamos en memoria el usuario
            // en este punto puede ser interesante guardar más datos en memoria para su posterior uso, como por ejemplo un array asociativo con el id, nombre, email, preferencias, ....
            
return true//usuario y contraseña validadas
        
} else {
            @
session_start();
            unset(
$_SESSION['USUARIO']); //destruimos la session activa al fallar el login por si existia
            
return false//no coincide la contraseña
        
}
    } else {
        
//El usuario no existe
        
return false;
    }

}

/**
 * Veridica si el usuario está logeado
 * @return bool
 */
function estoy_logeado () {
    @
session_start(); //inicia sesion (la @ evita los mensajes de error si la session ya está iniciada)
    
    
if (!isset($_SESSION['USUARIO'])) return false//no existe la variable $_SESSION['USUARIO']. No logeado.
    
if (!is_array($_SESSION['USUARIO'])) return false//la variable no es un array $_SESSION['USUARIO']. No logeado.
    
if (empty($_SESSION['USUARIO']['user'])) return false//no tiene almacenado el usuario en $_SESSION['USUARIO']. No logeado.

    //cumple las condiciones anteriores, entonces es un usuario validado
    
return true;

}

/**
 * Vacia la sesion con los datos del usuario validado
 */
function logout() {
    @
session_start(); //inicia sesion (la @ evita los mensajes de error si la session ya está iniciada)
    
unset($_SESSION['USUARIO']); //eliminamos la variable con los datos de usuario;
    
session_write_close(); //nos asegurmos que se guarda y cierra la sesion
    
return true;
}


    
?>


Bueno la cosa es que si lo pongo así no me lleva a ningún sitio, sé que debe ser sencillísimo pero no tengo narices de resolver la cosa, no me lleva a ninguna de las páginas que quiero que me lleve. ¿alguien sabe cómo puedo hacerlo?
« Última modificación: 30 de Septiembre 2014, 09:43 por Alex Rodríguez »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:sesiones de usuarios con php
« Respuesta #1 en: 29 de Septiembre 2014, 14:55 »
Hola, como solemos comentar usa por favor el botón # del foro para pegar código. Una vez lo pulsas te aparecen las etiquetas [ code ] ... [ / code], ahí entre esas etiquetas pega el código y luego pulsa previsualizar para ver si sale bien o si no hacer alguna corrección adicional.

Supongo que tienes activado el php debugging, si no actívalo como se comenta aquí: https://www.aprenderaprogramar.com/foros/index.php?topic=1261

Cuando tienes código relativamente largo no queda otra que ir haciendo comprobaciones paso a paso, lo primero comprueba que te está recuperando el usuario de la base de datos. Sería probar algo como esto:

Código: [Seleccionar]
switch($rs)
{
case "1":
//header('Location: volu.php');
echo 'DETECTADO CASE 1';
break;

case "2":
//header('Location: volu5.php');
echo 'DETECTADO CASE 2';
break;

case "3":
//header('Location: volu15.php');
echo 'DETECTADO CASE 3';
break;
default:
        echo "Aun no has puesto el nivel"; 

}

Según esto te funcione o no podrás enfocar el problema, ver si está al tratar de obtener el tipo de usuario o si está en la redirección.

Las comillas para detectar los case no me cuadran mucho, en la base de datos supongo que lo tendrás como valores numéricos.

Salu2

neosxxx

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re:sesiones de usuarios con php
« Respuesta #2 en: 29 de Septiembre 2014, 16:04 »
Ogramar muchas gracias por tu pronta respuesta, en primer lugar disculpa por no poner bien el codigo, no se volverá a repetir, a ver, te cuento un poco, si no pongo el switch y redirijo a una página funciona sin problemas, haciendo lo que me dices se queda en blanco:
Código: [Seleccionar]
if ($_SERVER['REQUEST_METHOD']=='POST') { // ¿Nos mandan datos por el formulario?
    include('php_lib/config.ini.php'); //incluimos configuración
    include('php_lib/login.lib.php'); //incluimos las funciones

    //verificamos el usuario y contraseña mandados
    if (login($_POST['usuario'],$_POST['password'])) {

       //acciones a realizar cuando un usuario se identifica
       //EJ: almacenar en memoria sus datos, registrar un acceso a una tabla de datos


        //saltamos al inicio del área restringida
        //header('Location: pagina-acceso-restringido.php');

//Sentencia SQL para buscar un usuario con esos datos
$ssql = "SELECT * FROM usuarios WHERE nivel='$nivel'";

//Ejecuto la sentencia
$rs = mysql_query($ssql,$link);

   
   
    if (mysql_num_rows($rs)!=0){

switch($rs)
{
case "1":
//header('Location: volu.php');
echo 'DETECTADO CASE 1';
break;

case "2":
// header('Location: volu5.php');
echo 'DETECTADO CASE 2';
break;

case "3":
// header('Location: volu15.php');
echo 'DETECTADO CASE 3';
break;
default:
        echo "Aun no has puesto el nivel"; 

}
}

die();
    } else {
        //acciones a realizar en un intento fallido
        //Ej: mostrar captcha para evitar ataques fuerza bruta, bloqueas durante un rato esta ip, ....


        //preparamos un mensaje de error y continuamos para mostrar el formulario
        $mensaje='Usuario o contraseña incorrectos.';
    }
} //fin if post
?>

igual que si no pongo nada, mi BD tiene esta estructura:
id             int(10)      UNSIGNED                   No   Ninguna   AUTO_INCREMENT   
usuario   varchar(45)   utf8_general_ci      No   Ninguna      
password   varchar(32)   utf8_general_ci      No   Ninguna      
nivel           int(60)                                 No   Ninguna   

con tres usuarios y en sus niveles 1,2,3.  La verdad que he hecho un monton de pruebas   
Te anexo imagen de la tabla...
« Última modificación: 29 de Septiembre 2014, 16:08 por neosxxx »

neosxxx

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re:sesiones de usuarios con php
« Respuesta #3 en: 29 de Septiembre 2014, 17:20 »
Mil gracias pero al final lo he solucionado... Era problema del select y de la conexion:
Código: [Seleccionar]
//Conectamos con la base de datos
  $conexion = mysql_connect(SERVIDOR_MYSQL, USUARIO_MYSQL, PASSWORD_MYSQL);
//si falla
    if (!$conexion) {
        trigger_error('Error al conectar al servidor mysql: ' . mysql_error(),E_USER_ERROR);
    }
    // Seleccionar la base de datos activa
    $db_selected = mysql_select_db(BASE_DATOS, $conexion);
    if (!$db_selected) {
        trigger_error ('Error al conectar a la base de datos: ' . mysql_error(),E_USER_ERROR);
    }

  $usr = $_POST['usuario'];
  //Sentencia SQL para buscar un usuario con esos datos
$registros=mysql_query("select usuario, nivel from usuarios where usuario = '".$usr."'",$conexion) or die("Problemas en el select:".mysql_error());
if ($reg=mysql_fetch_array($registros))
{
switch($reg['nivel'])
{
case 1:
header('Location: volu.php');
break;

case 2:
header('Location: volu5.php');
break;

case 3:
header('Location: volu15.php');
break;
default:
        echo "Aun no has puesto el nivel"; 

}
}

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:sesiones de usuarios con php
« Respuesta #4 en: 29 de Septiembre 2014, 17:30 »
Si no te entra en el switch eso es lo primero que tienes que resolver. ¿Por qué no entra? Tienes que comprobar los resultados que te estás trayendo. Prueba con algo como esto a ver qué resultados te devuelve:

Código: [Seleccionar]
//Una vez hecho el query...

echo 'Comprobando'.$rs;

$extraido1= mysql_fetch_array($rs);

echo 'Otra comprobacion: '.$extraido1;

if (mysql_num_rows($rs)!=0){

echo 'Entrando en el if';

switch($rs)
{
echo 'Entrando en el switch';
case "1":
header('Location: volu.php');
break;

case "2":
header('Location: volu5.php');
break;

case "3":
header('Location: volu15.php');
break;
default:
        echo "Aun no has puesto el nivel"; 

}
}


 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".