Comunidad de diseño web y desarrollo en internet online

Redirección de Usuarios según perfil

Citar            
MensajeEscrito el 07 Ago 2011 02:15 am
Saludos estimados compañeros. Estoy generando un sistema de usuarios los que tienen distintos niveles y quiero que después del login sean redirigidos a páginas específicas dentro del sitio según el siguiente criterio:

Perfil 1: Usuario: Sólo puede ver datos.
Perfil 2: Moderador: Puede ingresar y modificar datos.
Perfil 3: Administrador: Control total.

Luego de probar muchas formas y buscar por todo google no logro dar con mi error (seguro que es una tontera). El sistema es el siguiente.

1. Tengo una bd con una tabla "usuarios" y con los campos "id", "nombre", "password" y "perfil". En la bd tengo dos usuarios, uno marcado con perfil "1" y el otro marcado con "2".
2. Tengo un formulario simple donde el usuario ingresa su nombre y password.
3. El formulario redirige a "login.php" que funciona sin problemas.

Código PHP :

<?php
session_start();
if(isset($SESSION))
header("Cache-control: private");
require_once("conexion.php");
$sql = "select * from usuarios where usuario = '". mysql_real_escape_string ($_POST['usuario'])."' and password = '".mysql_real_escape_string ($_POST['password'])."' limit 1";
$resultado = mysql_query($sql) or die (mysql_error());
$data = mysql_fetch_array($resultado);
if($data==0) { header('Location: ../based/loginweb.php?error=si'); }
else { header('Location: ../php/redir.php');}
?>

Si el usuario y password son correctos prosigue, de lo contrario lanza el mensaje de error de usuario o password. Entonces redirige a "redir.php" que pretendo que sea el encargado de redirigir según el perfil. El scrip "redir.php" es el siguiente:

Código PHP :

<?php
session_start();
if(isset($SESSION))
header("Cache-control: private");
require_once("conexion.php");
$sql = "select * from usuarios where usuario and perfil";
$resultado = mysql_query($sql) or die (mysql_error());
$data = mysql_fetch_array($resultado);
switch ($resultado)
{
case ($resultado = 1): header('Location: ../based/vista-user.php'); break;
case ($resultado = 2): header('Location: ../based/vista-admin.php'); break;
}
?>

El síntoma ambos usuarios son redirigidos a la vista de usuario. He probado varias formas de plantear el switch, he probado con if/else pero nada. Siempre me manda a la vista de usuario, que por el momento sólo es una hoja en blanco que dice "usuario".

Creo que quizás mi problema esté en las sesiones pero cada cosa que encuentro en la red es distinta y aunque he probado con cada una no logro hacer que esto funcione. Dejo constancia de que ambos scripts los he escrito yo analizándo otros que he encontrado porque lo que quiero es aprender, además así siempre sé qué significa cada cosa.

Espero vuestra ayuda y orientación para encontrar donde estoy metiendo la pata. De antemano, muchas gracias.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 07 Ago 2011 04:35 am
La variable que usas en el switch debería ser $data, no $resultado. Y encima de eso, deberías usar el campo correspondiente ($data['perfil']), no la variable.

La sintaxis de cada case es errónea para tu caso porque estás comparando una asignación (y las asignaciones siempre son verdaderas).

Código PHP :

switch ($data['perfil']) {
   case 1: header('Location: ../based/vista-user.php'); break; 
   case 2: header('Location: ../based/vista-admin.php'); break; 
   default: break;
} 


(Por cosas como esta es que extraño Pascal...)

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 09 Ago 2011 10:07 pm
Muchas gracias DriverOp por tu respuesta. Corregí el código tal como me indicaste pero seguía sin funcionar, de modo que seguí pensando que era un problema con las sesiones. Seguí buscando y en efecto ese era el problema principal. Al final, probando y probando, conseguí pasar la sesión a redir, y con la modificación que sugeriste, logré por no sólo redireccionar a la página según el perfil, sino también lograr traspasar el nombre del usuario. Dejo los scripts para que vean como lo solucioné:

Formulario:

Código PHP :

<p>Ingreso a Sistema</p>
<form name="login" method="post" action="../php/login.php">
   <p><b>Usuario</b> <input type="text" name="usuario" value="" size="30" maxlength="50"/></p>
   <p><b>Password</b> <input type="password" name="password" value="" size="30" maxlength="50"/></p>
   <input type="submit" value="Ingresar" name="Enviar" />
</form> 
<br/>
<?php
   if ($_GET['error']=="eu") 
   { echo "<p>¡Nombre de Usuario o Password incorrectos!</p>"; } 
?>
<?php
   if ($_GET['error']=="es") 
   { echo "<p>Para ingresar a esta sección debes Iniciar Sesión</p>"; } 
?>

Login:

Código PHP :

<?php
session_start();
header("Cache-control: private");
require_once("conexion.php");
$sql = "select * from usuarios where usuario = '". mysql_real_escape_string ($_POST['usuario'])."' and password = '".mysql_real_escape_string ($_POST['password'])."' limit 1";
$resultado = mysql_query($sql) or die (mysql_error());
$data = mysql_fetch_array($resultado);
if($data==0) { header('Location: ../based/loginweb.php?error=eu'); }
else { 
$_SESSION['idLogin'] = $_POST['usuario'];
header('Location: ../php/redir.php');
}?>

Login redirige a "redir.php" que es el que, una vez que el usuario y el pass han sido comprobados, se encarga de redirigir a la página según el perfil y continúa la sesión.

Código PHP :

<?php
session_start();
header("Cache-control: private");
require_once("conexion.php");
if(!$_SESSION['idLogin'] !="0") {
header('Location: ../based/loginweb.php?error=es'); }
else {
$sql = "select usuario,perfil from usuarios where usuario = '$idLogin'";
$resultado = mysql_query($sql) or die (mysql_error());
$data = mysql_fetch_array($resultado);
switch ($data['perfil']) {    
case 1: header('Location: ../based/vista-user.php'); break;
case 2: header('Location: ../based/vista-admin.php'); break;
default: break; }
}
?>

Página de Usuario

Código PHP :

<?php
session_start();
header("Cache-control: private");
require_once("../php/conexion.php");
if(!$_SESSION['idLogin'] !="0") {
header('Location: ../based/loginweb.php?error=es'); }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
* <meta http-equiv="Expires" content="0" />
* <meta http-equiv="Pragma" content="no-cache" />
<title></title>
* <script type="text/javascript">
* {
* if(history.forward(1))
* location.replace(history.forward(1))
* }
* </script>
</head>
<body>
<?php
echo "Bienvenido Usuario $idLogin";
?>
<br/>
<br/>
<a href="../php/logout.php">Salir</a>
</body>
</html>

Las líneas que están con (*) son las que usé para evitar que el usuario, después de cerrar la sesión, vuelva a la página restringida. Una vez cerrada la sesión, tampoco es posible acceder a ella desde la barra de direcciones.

Logout:

Código PHP :

<?php
session_start();
session_unset();
session_destroy();
header ("location: ../based/loginweb.php"); 
?>

Y bueno, eso sería. Así como está funciona bien. Sólo me queda la duda de si es conveniente poner lo que está con asterisco en cada página o si debería agregarlo sólo al archivo "logout", porque la idea es desactivar el "atras" sólo cuando el usuario se ha deslogueado. Por último, me preocupa el tema de la seguridad. Si tuviesen alguna sugerencia sobre como mejorarla, sería estupendo, así puedo seguir aprendiendo.

Saludos a todos y gracias DriverOp una vez más por la amabilidad.

:cool:

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 09 Ago 2011 10:21 pm
Se me olvidaba comentar algo de vital importancia. Én mi servidor de pago lo anterior no funciona y en mi pc sí. ¿La diferencia? Que en mi pc la opción "register_globals" está en "On" y en mi servidor está en "Off". Sé que la desactivación tiene que ver con la seguridad. Sin embargo, he buscado y hasta donde entiendo la opción "session_register" deja de funcionar, pero al declarar variables como $_SESSION deberían funcionar. Leí las faqs de php pero por lo que veo dice que declare variables como $_SESSION que es lo que hice, pero aún así no funca. ¿Qué recomendaciones pueden darme? De antemano, muchas gracias.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 09 Ago 2011 10:45 pm
deberias replantearte la forma de crear sisitema... create una clase...

Por This-is-Purgatory

40 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 13 Ago 2011 03:39 am
He acomodado mis scripts para que sean "amigables" con "register_globals=off" modificándolos en base a la documentación de php y a la infinidad de foros en los que buscado. El tema es que con el cambio la redirección se murió. El archivo "redir.php" se queda en una ventana en blanco y no envía a la página siguiente. Si reemplazo todo el "switch" por un "echo" me sale el mensaje con el correspondiente nombre de usuario. A todo esto, también tengo el problema con "echo", pues no he logrado poner texto junto a la variable que quiero mostrar de la forma en que lo hacía en la versión "on" de mi script.

Antes:

Código PHP :

echo "Bienvenido Usuario $usuario";
Después:

Código PHP :

echo $_SESSION['usuario'];
Si agrego texto después del echo, con comillas o sin comillas da error.

Sin embargo, a pesar de que redir se quede colgado, si escribo la dirección de la página de usuario la página carga bien y muestra el nombre del usuario, por lo que deduzco que la sesión se inicia como corresponde. Y si cierro la sesión, se cierra. No puedo volver a la página de usuario ni por la url ni con el botón atrás del explorador. Hasta ahí bien.

Entonces, resumiendo, los dos problemas que persisten pese a mis esfuerzos son:

1. El problema de la redirección, que creo que tiene que ver con la asignación de la variable y la consulta sql.
2. La forma de formular el echo para que pueda incluir texto junto a la variable.

Y bueno, a continuación los scripts reacondicionados para register_globals=off.

Conexión a la BD:

Código PHP :

<?php  
$conexion = mysql_connect("servidor","nombre de usuario a la bd", "password");  
mysql_select_db("nombre de la bd", $conexion);  
@mysql_query("set names 'utf8'");
?>
Control de Sesión:

Código PHP :

<?php
session_start();
header("Cache-control: private");
if(!isset($_SESSION['usuario'])!="0") {
header('Location: ../based/loginweb.php?error=erse'); }
?>
Login:

Código PHP :

<?php
require_once("../php/session.php");
require_once("../php/conexion.php");
$sql = "select * from usuarios where usuario = '". mysql_real_escape_string ($_POST['usuario'])."' and password = '".mysql_real_escape_string ($_POST['password'])."' limit 1";
$resultado = mysql_query($sql) or die (mysql_error());
$data = mysql_fetch_array($resultado);
if($data==0) {
header('Location: ../based/loginweb.php?error=eu');
}
else { 
$usuario = $_POST['usuario'];
$_SESSION['usuario'] = $usuario;
header('Location: ../php/redir.php');
}
?>
Redirección (el archivo que está fallando):

Código PHP :

<?php
require_once("../php/session.php");
require_once("../php/conexion.php");
$consulta = "select usuario,perfil from usuarios where usuario = '$usuario'";
$resultado = mysql_query($consulta) or die (mysql_error());
$sql = mysql_fetch_array($resultado);
$_SESSION['perfil']= $$sql["perfil"]; 
switch($sql["perfil"]) {   
case 1: header('Location: ../based/vista-user.php'); break;
case 2: header('Location: ../based/vista-admin.php'); break;
default: break; }
?>
Página de Usuario

Código PHP :

<?php
require_once("../php/session.php");
require_once("../php/conexion.php");
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Pragma" content="no-cache" />
<title>Sin título 1</title>
<script type="text/javascript">
{
if(history.forward(1))
location.replace(history.forward(1))
}
</script>
</head>
<body>
VISTA USUARIO
<br/>
Bienvenido <?php echo $_SESSION['usuario'];?><br/>
<br/>
<br/>
<a href="../php/logout.php">Salir</a>
</body>
</html>
Cerrar Sesión:

Código PHP :

<?php
session_start();
unset($_SESSION['usuario']); 
unset($_SESSION['perfil']); 
header ("location: ../based/loginweb.php"); 
?>
Sé que es un post bastante largo, sin embargo, en todos los sitios que he buscado he encontrado el mismo problema al desactivar esa opción de php y hasta el momento no he encontrado una formulación que me permita salir solo del problema. De antemano muchas gracias por la buena voluntad de leer y ayudar.

Buena Caza y Largas Lunas.
:wink:

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.