Foros del Web » Programando para Internet » PHP »

[APORTE] Como separar usuarios normales, de administradores

Estas en el tema de [APORTE] Como separar usuarios normales, de administradores en el foro de PHP en Foros del Web. Hola, Esto es uno de los temas que mas me contactan por mp :P Ahora les voy a explicar como hacerlo, enbase a http://www.forosdelweb.com/f18/aport...suario-725268/ Para ...
  #1 (permalink)  
Antiguo 16/09/2009, 22:15
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 7 meses
Puntos: 101
[APORTE] Como separar usuarios normales, de administradores

Hola,
Esto es uno de los temas que mas me contactan por mp :P
Ahora les voy a explicar como hacerlo, enbase a http://www.forosdelweb.com/f18/aport...suario-725268/

Para empezar, vamos a nesesitar una fila mas en la tabla ( donde vamos a tener el rango del usuario ), por ejemplo rank:
Código sql:
Ver original
  1. CREATE TABLE `users` (
  2. `id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  3. `nick` VARCHAR( 100 ) NOT NULL ,
  4. `clave` VARCHAR( 100 ) NOT NULL ,
  5. `rank` INT( 1 ) NOT NULL ,
  6. `email` VARCHAR( 100 ) NOT NULL
  7. ) ENGINE = MYISAM ;
Hay pondremos el rango numericamente, por ejemplo:
Código:
0: Usuario desactiva, no activo su cuenta (opcional)
1: Usuario normal, cuanta activada
5: Usuario baneado (opcional)
8: Usuario adminitrador
etc..
Lo unico que tendriamos que editar, es entrar.php:
Código php:
Ver original
  1. <?php
  2. include('config.php'); // Incluimos la conexion a la bd y la session
  3.  
  4. $user=$_POST['usuario'];
  5. $clave=$_POST['clave'];
  6.  
  7. $consulta="SELECT * FROM users WHERE nick='".$user."' AND clave='".$clave."'"; // Selecionamos el nick y la clave
  8. $consultar=mysql_query($consulta,$conexion) or die(mysql_error()); // En el primer parametro ponemos la consulta, y en el segundo ponemos la conexion a la bd
  9. if(mysql_num_rows($consultar)==1){ // mysql_num_rows sirve para saber cuantos resultados devolvio la consulta
  10.     // Si devolvio 1 resultado, es que los datos del usuario estan bien, porque selecionamos de la bd el nick y la clave.
  11.     // es casi imposible que devuelva mas de 1, porque deven aver 2 personas que se registren con el mismo nick y clave, pero ya
  12.     // vamos a evitar eso en el registro
  13.    
  14.     $datos=mysql_fetch_array($consultar); // Recojemos los datos del usuario
  15.    
  16.     switch($datos['rank']){
  17.         case 0: // Si el rank es 0, la cuenta esta desactivada
  18.             die("Tu usuario no esta activado!");
  19.         break;
  20.         case 5: // Si el rank es 5, la cuenta esta baneada
  21.             die("Tu usuario fue banneado de aqui!");
  22.         break;
  23.         case 8: // Si es 8, es un administrador
  24.             $_SESSION['usuario']=$user; // Creamos la session y le damos un dato para que lo guarde, con esta session identificamos al usuario en cualquier parate de la web.
  25.             $_SESSION['administrador']='on'; // Creamos la session del administrador, para saber mas tarde.
  26.            
  27.             echo "Hola adminitrador!";
  28.         break;
  29.         default: // Si no es ninguno de los otros, es usuario normal
  30.             $_SESSION['usuario']=$user; // Creamos la session y le damos un dato para que lo guarde, con esta session identificamos al usuario en cualquier parate de la web.
  31.             echo "Se a logeado correctamente como ".$user;
  32.         break;
  33.     }
  34.        
  35. }else{ // Sino devolvio 1 resultado
  36.     echo "Datos inconrrectos. Intente denuevo.";
  37. }
  38. ?>
Recuerden definir al registrar, el rango( rank ) de usuario.

Para implementarlo en Easy Login:
Código php:
Ver original
  1. <?php
  2. include('EasyLogin 3-0.php');
  3. $sis = new EasyLogin(array("localhost","root","","base_de_datos"),'users',array('nick','clave'));
  4.  
  5. $usuario = 'demo_user'; // Usuario a registrar
  6. $clave = 'demo'; // Clave del usuario
  7.  
  8. if($sis->loginUser($usuario,$clave)){
  9.     $datos=$sis->dataUser($usuario);
  10.     switch($datos['rank']){
  11.         case 0: // Si el rank es 0, la cuenta esta desactivada
  12.             die("Tu usuario no esta activado!");
  13.         break;
  14.         case 5: // Si el rank es 5, la cuenta esta baneada
  15.             die("Tu usuario fue banneado de aqui!");
  16.         break;
  17.         case 8: // Si es 8, es un administrador
  18.             $_SESSION['usuario']=$usuario; // Creamos la session y le damos un dato para que lo guarde, con esta session identificamos al usuario en cualquier parate de la web.
  19.             $_SESSION['administrador']='on'; // Creamos la session del administrador, para saber mas tarde.
  20.            
  21.             echo "Hola adminitrador!";
  22.         break;
  23.         default: // Si no es ninguno de los otros, es usuario normal
  24.             $_SESSION['usuario']=$usuario; // Creamos la session y le damos un dato para que lo guarde, con esta session identificamos al usuario en cualquier parate de la web.
  25.             echo "Se a logeado correctamente como ".$usuario;
  26.         break;
  27.     }  
  28. }else{
  29.     echo "Usuario o clave incorrecto";
  30. }
  31.  
  32.  
  33. $sis->closedBD(); // Cerramos la conexion a la bd
  34. ?>
Haci de facil!

Bueno eso es todo el tutorial :P
Espero que les ayude..
Salu2

PD: Recuerden el tema de seguridad.. yo no probe el codigo, lo hice mientras escribia el tutorial
__________________
Half Music - www.halfmusic.com

Última edición por pato12; 19/12/2009 a las 20:48
  #2 (permalink)  
Antiguo 17/09/2009, 00:39
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 16 años, 1 mes
Puntos: 16
Respuesta: [APORTE] Como separar usuarios normales, de adminitradores

yo gestiono a los usuarios de la sigiente forma

Código sql:
Ver original
  1. CREATE TABLE IF NOT EXISTS `usuarios` (
  2.   `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3.   `grupo_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  4.   `login` VARCHAR(45) NOT NULL DEFAULT '',
  5.   `password` VARCHAR(45) NOT NULL DEFAULT '',
  6.   `status` INT(1) NOT NULL DEFAULT '',
  7.   PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
  9.  
  10.  
  11. CREATE TABLE IF NOT EXISTS `grupos` (
  12.   `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  13.   `grupo` VARCHAR(45) NOT NULL DEFAULT '',
  14.   PRIMARY KEY (`id`)
  15. ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

y gestiono todo a travez de esta clase
Código php:
Ver original
  1. class usuario{
  2.         var $id=null;
  3.         var $init = null;
  4.         var $getInfo = false;
  5.         var $isLogin = false;
  6.         /**
  7.          * Constructor de la clase, necesaria para la comprabacion interna
  8.          * setea la variable $init para comprobar que la clase esta instanciada
  9.          * para acciones publicas no se requiere la variable
  10.          * @return Void
  11.          * @access public
  12.          * @static
  13.          */
  14.          
  15.         function usuario(){
  16.             $this->init = true;
  17.         }
  18.        
  19.         /**
  20.          * logea al Usuario, realiza una comprobacion devuelve true en caso de exito
  21.          * @param $loginInfo Array con los datos para el logueo
  22.          * @return Void    
  23.          * @access public
  24.          * @static
  25.          */
  26.         function login ($loginInfo){
  27.             if($this->init === true){
  28.                if($this->checkLogin($loginInfo)==true){
  29.                    $this->getInfo = true;
  30.                    $this->id = $this->getThisId($loginInfo);
  31.                    $this->getInfo = false;
  32.                    $this->isLogin = true;
  33.                    $_SESSION['login']=$this->id;
  34.                    return true;
  35.                }else{
  36.                  return false;
  37.                }
  38.             }else{
  39.                 return 'no se inicio variable';
  40.             }
  41.         }
  42.        
  43.        
  44.         /**
  45.          * Destruye la sesion
  46.          * @param $loginInfo Array con los datos para el logueo
  47.          * no se requiere instanciar la clase para desloguearse
  48.          * @return Void
  49.          * @access public
  50.          * @public
  51.          */
  52.         function logout(){
  53.             session_destroy();
  54.             $this->isLogin = false;
  55.         }
  56.        
  57.        
  58.        
  59.        
  60.        
  61.        
  62.          /*
  63.         *
  64.         * FUNCIONES para chequear informacion
  65.         *
  66.         *
  67.         * * */
  68.        
  69.        
  70.        
  71.        
  72.         /**
  73.          * Comprueba que exista el usuario y que coincida la contraseña
  74.          * en caso de exito devuelve true
  75.          * @param $loginInfo Array con los datos para el logueo
  76.          * @return Void
  77.          * @access public
  78.          * @static
  79.          */
  80.         function checkLogin($loginInfo){
  81.             if($this->init === true){
  82.                 global $DbConn;
  83.                     $user = mysql_real_escape_string($loginInfo[0]);
  84.                     $pass = mysql_real_escape_string($loginInfo[1]);
  85.                     $sql = 'SELECT COUNT(id) as num FROM usuarios WHERE login="'.$user.'" AND password="'.$pass.'"';
  86.                     $dat = $DbConn->fetchArray($DbConn->query($sql));
  87.                     if ($dat['num'] == 1){
  88.                         return true;
  89.                     }else{
  90.                         return false;
  91.                     }
  92.             }
  93.         }
  94.        
  95.        
  96.        
  97.         /*
  98.         *
  99.         * FUNCIONES para recuperar informacion
  100.         *
  101.         *
  102.         * * */
  103.        
  104.         /**
  105.          * Devuelve el id del usuario  comprueba si la variable getInfo es true
  106.          * @param $loginInfo Array se necesita el usuario
  107.          * @return Void
  108.          * @access public
  109.          * @static
  110.          */
  111.         function getThisId($loginInfo){
  112.               if($this->init === true){
  113.                   if($this->getInfo === true){
  114.                     global $DbConn;
  115.                         $user = mysql_real_escape_string($loginInfo[0]);
  116.                         $sql = 'SELECT id AS request FROM usuarios WHERE login = "'.$user.'"';
  117.                         $dat = $DbConn->fetchArray($DbConn->query($sql));
  118.                         return $dat['request'];
  119.                   }
  120.               }
  121.         }
  122.        
  123.         /**
  124.          * Devuelve el nombre del usuario  
  125.          * solamente si el usuario esta logueado
  126.          * @param $loginInfo Array se necesita el usuario
  127.          * @return Void
  128.          * @access public
  129.          * @static
  130.          */          
  131.         function getThisNombre(){
  132.            if($this->isLogin()){
  133.             $this->id = $_SESSION['login'];
  134.             if($this->id != null){
  135.                 global $DbConn;
  136.                     $sql = 'SELECT login AS request FROM usuarios WHERE id='.$this->id;
  137.                     $dat = $DbConn->fetchArray($DbConn->query($sql));
  138.                     return $dat['request'];
  139.             }
  140.            }
  141.         }
  142.        
  143.         /**
  144.          * Devuelve el nombre del grupo del usuario  
  145.          * solamente si el usuario esta logueado
  146.          * @param $loginInfo Array se necesita el usuario
  147.          * @return Void
  148.          * @access public
  149.          * @static
  150.          */          
  151.         function getThisGrupo(){
  152.             $this->id = $_SESSION['login'];
  153.             if($this->id != null){
  154.                 global $DbConn;
  155.                     $sql = 'SELECT grupo AS request
  156.                            FROM usuarios AS us
  157.                            LEFT JOIN grupos AS gr
  158.                            ON us.grupo_id = gr.id
  159.                            WHERE us.id = '. $this->id;
  160.                     $dat = $DbConn->fetchArray($DbConn->query($sql));
  161.                     return $dat['request'];
  162.             }
  163.         }                
  164.              
  165.        
  166.         function isLogin(){
  167.             if(isset($_SESSION['login'])){
  168.                 return true;
  169.             }else{
  170.                 return false;
  171.             }
  172.         }
  173. }


en un archivo de configuracion agrego lo siguiente
Código php:
Ver original
  1.  
  2. //definimos las CONSTANTES para la conexion mysql
  3. define('DB_HOST','localhost');
  4. define('DB_USER','root');
  5. define('DB_PASS','');
  6. define('DB_NAME','base');
  7.  
  8. //incluimos las clases
  9. include 'class/odbcon.php';
  10. include 'class/class.usuarios.php';
  11.  
  12. //creamos los objetos globales, usActual y DbConn;
  13. global $usActual;
  14. $usActual = new usuario();
  15.  
  16. global $DbConn;
  17. $DbConn = new DbConn(DB_HOST,DB_USER,DB_PASS);
  18. $DbConn -> connect();
  19. $DbConn -> selectDb(DB_NAME);

esto es porque el usuario siempre va a ser el mismo que esta en la sesion web
la clase odbcon se encuentra en este link

proceso de informacion para el logueo

Código php:
Ver original
  1. <?php
  2.  
  3. //incluimos el archivo de configuracion
  4. include 'config.php';
  5.  
  6.  
  7.  
  8. //lamamos a la global usActual para hacer las comprobaciones
  9.     global $usActual;
  10.    
  11.     $urlRedirect = 'ejemplo.php'; // url a donde redireccionamos
  12.  
  13.  
  14.     //si es esta definida la variable $_POST['login']
  15.         if($_POST['login']){
  16.             // comrpobamos que el usuario y la contraseña sean correctas con la funcion usuario->login, que devolvera true si esta todo correcto, guardando la session
  17.                 if($usActual->login(array($_POST['login'],$_POST['password']))){
  18.                                            
  19.                     echo '<b>Conexion exitosa. Redireccionando a '.$urlRedirect.'...</b>';
  20.                     echo '
  21.                             <script>
  22.                                 // redireccionamos ne 3 segundos para que se logre ver el mensaje publuicado arriba
  23.                                 setTimeout("document.location.href=\''.$urlRedirect.'\'",3000);
  24.                              </script>';
  25.                 }else{
  26.                     echo 'usuario o contraseña incorrecta, vuelva a intentarlo';
  27.                     echo '
  28.                         <script>
  29.                             // redireccionamos ne 3 segundos para que se logre ver el mensaje publuicado arriba
  30.                             setTimeout("document.location.href=\''.$urlRedirect.'\'",3000);
  31.                          </script>';
  32.                 }
  33.                
  34.         }
  35.  
  36.         if($_GET['accion']=='logout'){
  37.             $usActual->logout();
  38.                 echo '<b>Desconexion exitosa. Redireccionando a '.$urlRedirect.'...</b>';
  39.                 echo '
  40.                         <script>
  41.                             // redireccionamos ne 3 segundos para que se logre ver el mensaje publuicado arriba
  42.                             setTimeout("document.location.href=\''.$urlRedirect.'\'",3000);
  43.                          </script>';
  44.         }
  #3 (permalink)  
Antiguo 17/09/2009, 00:40
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 16 años, 1 mes
Puntos: 16
Respuesta: [APORTE] Como separar usuarios normales, de adminitradores

pagina de ejemplo
Código php:
Ver original
  1. <?php
  2. session_start(); // iniciamos la session o la continuamos
  3. //incluimos las clases o un archivo de configuracion (recomendado)
  4.     include 'config.php';
  5.    
  6.     //creo el formulario para el logue, luego hago las comparaciones para ver si  lo muestro o no, mientras tanto lo mantengo en una variable
  7.     $formLogin = '  <form action="proceso.php" method="POST">
  8.                                 <label>Usuario</label>
  9.                                 <input type="text" name="login" class="form" />
  10.                                 <label>Password</label>
  11.                                 <input type="password" name="password" class="form" />
  12.                                 <input type="submit" value="Login" class="form" id="btn" />
  13.                     </form>';
  14.    
  15.     //hiciamos la pagina
  16.    
  17.     $html = '<html>
  18.                 <head>
  19.                     <title>ejemplo</title>
  20.                     <style>
  21.                         .signin {height:39px; background:#282828}
  22.                         .signin label, .signin .form {float:left;height:18px;}
  23.                         .signin label {padding:5px 10px;color:#FFF}
  24.                         .signin .form {margin-top:8px;margin-right:10px;background:#2B464D;border:solid 1px #172629;color:#FFF;text-align:right}
  25.                         .signin #btn {width:56px;height:27px;background:#476F27;border:none;padding:0 0 6px 0;font-size:12px;color:#FFF;margin:0;text-align:center}
  26.                     </style>
  27.                 </head>
  28.                 <body>';
  29.    
  30.     // comprobamos si el usuario esta logueado para ello utilizamos la global $usActual que la definimos en config.php
  31.     global $usActual;
  32.    
  33.     $html .='<div class="right"><div class="signin">';
  34.         if(!$usActual->isLogin()){
  35.             // si no esta logueado concatenamos el formulario
  36.             $html .= $formLogin;
  37.         }else{
  38.             $html .= '<label>bienvenido '.$usActual->getThisNombre().'</label>';
  39.             // vemos si pertenece al grupo administrador
  40.             if($usActual->getThisGrupo() == 'Admin'){
  41.                 $html .= '<label><a href="#">Panel</a></label>';
  42.             }
  43.             $html .= '<label><a href="proceso.php?accion=logout">Logout</a></label>';
  44.         }
  45.     $html .='</div></div>';
  46.    
  47.    
  48.     //mostramos la pagina
  49.    
  50.     echo $html;

para comprobar si es administrador utilizo if($usActual->getThisGrupo() == 'Admin')
  #4 (permalink)  
Antiguo 17/09/2009, 07:30
 
Fecha de Ingreso: julio-2009
Ubicación: .mysql_error ( XD )
Mensajes: 554
Antigüedad: 14 años, 9 meses
Puntos: 13
Respuesta: [APORTE] Como separar usuarios normales, de adminitradores

sin duda está es una de las preguntas más recurrentes, muchas gracias Pato por compartir ese scrip con nosotros...

saludos

PD: Samu tambien se lleva la mencion en los agradecimientos...
__________________
Mi Bosque de Sombras Solo Doom Metal!

por favor use esta etiqueta para publicar su código --->[HIGHLIGHT]
  #5 (permalink)  
Antiguo 17/09/2009, 14:23
Avatar de danistrein  
Fecha de Ingreso: septiembre-2008
Ubicación: Salta Capital
Mensajes: 550
Antigüedad: 15 años, 7 meses
Puntos: 9
Respuesta: [APORTE] Como separar usuarios normales, de administradores

muy buen aporte gracias pato :P

La proxima vos ya sabes ¬¬
__________________
Appones.net - www.appones.net
  #6 (permalink)  
Antiguo 22/09/2009, 12:26
 
Fecha de Ingreso: noviembre-2008
Ubicación: En algún lugar del disco duro.
Mensajes: 95
Antigüedad: 15 años, 5 meses
Puntos: 0
De acuerdo Respuesta: [APORTE] Como separar usuarios normales, de administradores

Gracias amigo pato12 me has ayudado mucho
  #7 (permalink)  
Antiguo 09/11/2009, 14:25
 
Fecha de Ingreso: noviembre-2009
Mensajes: 2
Antigüedad: 14 años, 5 meses
Puntos: 0
Sonrisa Como separar usuarios normales, de administradores

Hola pato, mcuhas gracias me sirvio mucho, oye pero para restringuir paginas a solo administradares como se hace?, y en su caso a los demas usuarios es igual que antes?, gracias de antemano.
  #8 (permalink)  
Antiguo 09/11/2009, 14:55
Avatar de danistrein  
Fecha de Ingreso: septiembre-2008
Ubicación: Salta Capital
Mensajes: 550
Antigüedad: 15 años, 7 meses
Puntos: 9
Respuesta: Como separar usuarios normales, de administradores

Cita:
Iniciado por yxhy Ver Mensaje
Hola pato, mcuhas gracias me sirvio mucho, oye pero para restringuir paginas a solo administradares como se hace?, y en su caso a los demas usuarios es igual que antes?, gracias de antemano.
hola yxhy yo lo ago asi :
Código PHP:
include('EasyLogin 3-0.php');
$sis = new EasyLogin(array("localhost","root","","base_de_datos"),'users',array('nick','clave'));
$datos=$sis->dataUser($usuario);
switch(
$datos['rank']){

case 
8// Administrador 
$_SESSION['usuario']=$usuario
$_SESSION['administrador']='on'
echo 
"aka toda la pagina del administrador";
break;

default: 
// User Normal
$_SESSION['usuario']=$usuario
echo 
$usuario;
echo 
",no puedes aceder a esta parte de la web,Solo administradores.";
break; 
espero que te sirba...
__________________
Appones.net - www.appones.net
  #9 (permalink)  
Antiguo 09/11/2009, 15:14
(Desactivado)
 
Fecha de Ingreso: junio-2009
Mensajes: 256
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: [APORTE] Como separar usuarios normales, de administradores

buen aporte.

saludos.
  #10 (permalink)  
Antiguo 10/11/2009, 08:59
 
Fecha de Ingreso: noviembre-2009
Mensajes: 2
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: [APORTE] Como separar usuarios normales, de administradores

Hola, pero para el normal sin EasyLogin... Saludos
  #11 (permalink)  
Antiguo 12/11/2009, 00:22
Avatar de danistrein  
Fecha de Ingreso: septiembre-2008
Ubicación: Salta Capital
Mensajes: 550
Antigüedad: 15 años, 7 meses
Puntos: 9
Respuesta: [APORTE] Como separar usuarios normales, de administradores

Cita:
Iniciado por yxhy Ver Mensaje
Hola, pero para el normal sin EasyLogin... Saludos
tendrias que crear una class nueva xD, pero es mas recomendable usar el easylogin xD, ya que el normal tiene bug
__________________
Appones.net - www.appones.net
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:11.