Foros del Web » Programando para Internet » PHP » CodeIgniter »

gestion de Usuarios en Codeigniter, con problemas.

Estas en el tema de gestion de Usuarios en Codeigniter, con problemas. en el foro de CodeIgniter en Foros del Web. Hola amigos, en estoy dias e intentado hacer un sistema de gestion de usuario se que en realidad no es un sistema pero me gusta ...
  #1 (permalink)  
Antiguo 29/01/2011, 16:37
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 4 meses
Puntos: 4
gestion de Usuarios en Codeigniter, con problemas.

Hola amigos, en estoy dias e intentado hacer un sistema de gestion de usuario se que en realidad no es un sistema pero me gusta como suena. Para esto e generado el siguiente modelo.


Lo que estoy haciendo es intentar manejar el acceso a controladores específicos, donde cada modulo tiene un o mas controladores

Ademas un usuario puede tener muchos perfiles, pero cada perfil tiene uno o barios módulos.
El caso es que en ModulosxPerfil, esta el campo "permisos" en el cual yo asigno el nivel de acceso para un determinado perfil en un modulo.
Los permisos son de tipo 777(Ingresar, Modificar, Buscar, Eliminar) y así va bariando.

Para trabajar en codeigniter agregue en la carpeta library, la libreria Session, porque maneja mejor las sessiones que la libreria nativa.

Cuando un usuario hace login, se envia por session el perfil de usuario para luego sacar a que menus tiene acceso asi:

controlador: login.php function validar_user
Código PHP:
      $this->load->model('usuario_model');
    
$query $this->usuario_model->validar();                
          if(
$query['op'])
        {
                      
$data = array(
                
'username' => $this->input->post('username'),
                
'is_logged_in' => true,
                                
'perfil' => $query['idPerfil']
            );
            
$this->session->set_userdata($data);                        
            
redirect('site/principal');
        }
        else
        {
            
$this->index();
        }
    } 
Se redirige a site.php function principal()
Código PHP:
//extrae el id de perfil
$idPerfil $this->session->userdata('perfil');

            
$this->load->model('menu');
//extre los accesos a los modulos y el nivel de permiso
            
$data['datos_menu']=$this->menu->ModuloControlador($idPerfil);

//esto es para un menu lateral que tengo, los datos de un array completo seria 
// $data['lateral']= arrya("nombreControlado","permisos","mostrar_menu");
            
$data['lateral'] = array('','','no'); 
y cuando construyo el menu en la vista tiene este aspecto:
view: inicio.php
Código PHP:
if($lateral[2]=='si'){
        echo '<div class="grid_3" id="menulateral">
        <ul class="ulateral">';
//lista los menus segun su acceso
                    switch ($lateral[0]){

                        case 1: ?>
                            <li><?php echo '<a href="'.base_url().$lateral[1],'/buscar_'.$lateral[1].'/'.$lateral[0].'">'?>Buscar</a></li>
                            <li><?php echo '<a href="'.base_url().$lateral[1],'/registrar_'.$lateral[1].'/'.$lateral[0].'">'?>Registrar</a></li>
                            <li><?php echo '<a href="'.base_url().$lateral[1],'/modificar_'.$lateral[1].'/'.$lateral[0].'">'?>Modificar</a></li>
                            <li><?php echo '<a href="'.base_url().$lateral[1],'/eliminar_'.$lateral[1].'/'.$lateral[0].'">'?>Eliminar</a></li>
              <?php
                            
break;

.
.
.                       

                    }
        echo 
'</ul></div>
            <div class="grid_9" id="content">'
;
    }else{
        echo 
'<div class="grid_13">';
    }
    
?>
Pues bien esto funciona pero cada link envia por la url un numero para saber en el siguiente controlador nuevamente a que menus tiene acceso, el caso es que si modifican ese numero por la barra de direcciones, pues se muestra menús que no deben, e intentado hacer que en cada link se compruebe el usuario y los permisos cada vez pero no logro aplicarlo y ademas esa acción se repetiría en cada controlador.
¿Qué podria hacer?
__________________
Dejando una huella de mi existencia por la red en http://tiricaya.com
  #2 (permalink)  
Antiguo 30/01/2011, 22:03
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 4 meses
Puntos: 4
Respuesta: gestion de Usuarios en Codeigniter, con problemas.

hay algunos problemas en cuanto a la aplicación de este "sistema" y pasa que tengo que hacer en cada controlador una consulta a la base de datos y comprobar todos desde un inicio. ¿Como plantean ustedes la gestión de los usuarios?
__________________
Dejando una huella de mi existencia por la red en http://tiricaya.com
  #3 (permalink)  
Antiguo 31/01/2011, 15:12
Avatar de alcide  
Fecha de Ingreso: diciembre-2008
Mensajes: 52
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: gestion de Usuarios en Codeigniter, con problemas.

Mira el sistema de autenticación de noquieroprogramar

Estoy casi seguro que resolverás....

Si te sigue dando problemas trata de crear un Hook que te verifique el rol de usuario..

El problema de los menú según el tipo de usuario...

Yo lo que hago es pasar el valor del menú que quiero que se muestre
//Controlador
Código:
	function index()
	{
//según la función es el dato que le paso
	$datos['selec1']="seleccion";
		$this->load->view("cabecera" , $datos);
		$datos['query'] = $this->db->get('usuarios');
		
		$this->load->view("usuarios/index", $datos);
		$this->load->view("pie");		
	}
//vista
Cita:
<?php

if(empty($selec1)){
$sel1="";
}
else {
$sel1=$selec1;
}

if(empty($selec2)){
$sel2="";
}
else {
$sel2=$selec2;
}
if(empty($selec3)){
$sel3="";
}
else {
$sel3=$selec3;
}
if(empty($selec4)){
$sel4="";
}
else {
$sel4=$selec4;
}
if(empty($selec5)){
$sel5="";
}
else {
$sel5=$selec5;
}
if(empty($selec6)){
$sel6="";
}
else {
$sel6=$selec6;
}
?>

<?php $centinela = new Centinela();
if(!$centinela->getAuth()): ?>
<li class="<?php echo $sel5; ?>"><a href="<?php echo base_url();?>index.php/contactar"><b>Contactar</b></a></li>
<li class="<?php echo $sel2; ?>"><a href="<?php echo base_url();?>index.php/usuarios/login"><b>Acceder</b></a></li>
<?php else: ?>
<li class="<?php echo $sel1; ?>"><a href="<?php echo base_url();?>"><b>Inicio</b></a></li>
<li class="<?php echo $sel3; ?>"><a href="<?php echo base_url();?>index.php/usuarios/registrar"><b>Registrarse</b></a></li>
<li class="<?php echo $sel4; ?>"><a href="<?php echo base_url();?>index.php/ayuda"><b>Ayuda</b></a></li>
<li class="<?php echo $sel5; ?>"><a href="<?php echo base_url();?>index.php/contactar"><b>Contactar</b></a></li>
<li class="<?php echo $sel6; ?>"><a href="<?php echo base_url();?>index.php/usuarios/logout"><b>Salir</b></a></li>
<?php endif; ?>
</ul>
Bueno tan solo es una idea..

saludos
  #4 (permalink)  
Antiguo 03/02/2011, 07:50
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 4 meses
Puntos: 4
Respuesta: gestion de Usuarios en Codeigniter, con problemas.

Gracias amigo, ya cree mi propia librería para manejar la autenticación y me funciona muy bien.

Pero estoy teniendo un problema al cual me gustaria que me ayudaran, se trata del hooks:
Código PHP:
Ver original
  1. class Acceso
  2. {
  3.    
  4.     function identificado(){
  5.         $this->CI =&get_instance();
  6.         $controllersprivados = array('user', 'home');
  7.        
  8.         if($this->CI->session->userdata('logged_in')==true && $this->CI->router->method == 'login') redirect('home');
  9.        
  10.         if($this->CI->session->userdata('logged_in')!=true && $this->CI->router->method!='login' && in_array($this->CI->router->class, $controllersprivados)) redirect('user/login');
  11.     }
  12. }
Esto lo vi en un tutorial del blog de David Rojas, pasa que funciona tan bien que cuando alguien se hace un logueo lo redirecciona nuevamente al login.

El primer if funciona bien, lo que se que hace, es verificar que si logged_in es true, y ademas que si estamos en el método login, redireccione al área privada.

El segundo es parecido, verifica que no este en true logged_in y si los métodos a los que quiere acceder el usuario son del area privada entonces hace una redirección al controlador del login.

Como les dije cuando ingreso con el usuario y contraseña pues no avanza, ya hize algunas variaciones a esas sentencias, como el hacer la sintaxis completa de los if, luego hacer que la segunda opción sea parte de un else o else if y hasta con un switch pero en estos casos se muestra en el navegador un error que hay un scrip haciendo muchas redirecciones que nunca acabaran.
__________________
Dejando una huella de mi existencia por la red en http://tiricaya.com
  #5 (permalink)  
Antiguo 03/02/2011, 09:41
Avatar de alcide  
Fecha de Ingreso: diciembre-2008
Mensajes: 52
Antigüedad: 15 años, 4 meses
Puntos: 0
De acuerdo Respuesta: gestion de Usuarios en Codeigniter, con problemas.

Hola Amigo Copia

Cita:
Iniciado por Copia Ver Mensaje
Código PHP:
Ver original
  1. class Acceso
  2. {
  3.    
  4.     function identificado(){
  5.         $this->CI =&get_instance();
  6.         $controllersprivados = array('user', 'home');
  7.        
  8.         if($this->CI->session->userdata('logged_in')==true && $this->CI->router->method == 'login') redirect('home');
  9.        
  10.         if($this->CI->session->userdata('logged_in')!=true && $this->CI->router->method!='login' && in_array($this->CI->router->class, $controllersprivados)) redirect('user/login');
  11.     }
  12. }
El código anterior es el archivo application/hooks/acceso.php?

Prueba con esto a ver que tal te va.....

Código PHP:
Ver original
  1. <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?>
  2. <?php
  3. //application/hooks/acceso.php
  4. class Acceso {
  5.  
  6. function identificado (){
  7. //Tus controles privados
  8. //Solo accedes si estás autenticado
  9. $this->CI =&get_instance();
  10. $controllersprivados=array('usuarios','noticias','ayuda');
  11.  
  12.        
  13. if ($this->CI->session->userdata('logged_in')==true && $this ->CI->router->method=='login') redirect('home');
  14. if ($$this->CI->session->userdata('logged_in')!=true && $this ->CI->router->method!='login' && in_array($this->CI->router->class, $controllersprivados)) redirect('user/login');;
  15.  
  16.  
  17. }
  18. }
  19.  
  20. ?>
  21.  
  22. //application/config/hook.php
  23.  
  24. $hook['post_controller_constructor']=array(
  25. 'class'=>'Acceso',
  26. 'function'=>'identificado',
  27. 'filename'=>'acceso.php',
  28. 'filepath'=>'hooks',
  29. );

Si no resuelves entonces donde utilizas
Código PHP:
$this->CI->session->userdata('logged_in'
Sustitúyelo por la variable que tienes en tu clase librería es decir la bandera (true ó false) de si estás autenticado o no..
Ejemplo
Código PHP:
<?php 
$libreriases
= new Librerias();
//Entonces sustituyes en la clase acceso la línea 
//esta 
$this->CI->session->userdata('logged_in')
// por esta que debe ser el método que te devuelve si el usuario está autenticado o no
$libreriases->getAuth()
?>
saludos
  #6 (permalink)  
Antiguo 03/02/2011, 13:11
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 4 meses
Puntos: 4
Respuesta: gestion de Usuarios en Codeigniter, con problemas.

Gracias. Bien la solución que implante es que quite de controllersprivados al controlador del login y ahora ya me funciona correctamente.
__________________
Dejando una huella de mi existencia por la red en http://tiricaya.com
  #7 (permalink)  
Antiguo 06/02/2011, 10:48
Avatar de alcide  
Fecha de Ingreso: diciembre-2008
Mensajes: 52
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: gestion de Usuarios en Codeigniter, con problemas.

Vale muy bien pensado...

Saludos

Etiquetas: gestion, usuarios
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 18:38.