Aplicacion, gestionar usuarios, accesos y permisos

2,389 views
Skip to first unread message

linux.wow

unread,
Aug 25, 2010, 12:45:27 PM8/25/10
to CodeIgniter-spanish
Buenas a toda la comunidad

Tengo un trabajo en la U y me falta 1 día para entregarlo, yo elegí
hacerlo bajo CI pero estoy en completos quebraderos de cabeza =(

APLICACIÓN: Desarrollar una aplicación para gestionar usuarios,
niveles de acceso y permisos.

Lo que la aplicación puede hacer es:
USUARIOS:
- nuevo usuario
- Listar usuarios

PRODUCTOS
- nuevo producto
- listar productos
- buscar productos

FACTURAS
- nueva factura
- lista facturas

Por defecto la aplicación tiene creado un usuario (admin) con acceso a
los 7 links, entonces lo que hace es dar de alta a un nuevo usuario.

- id_usuario (autonumérico)
- nombre_usuario
- email (usado para acceder a la aplicación)
- password (aleatorio de 4 dígitos)
- permisos (Aquí en permisos me imagino a 7 checks con los accesos a
las diferentes partes)


NUEVO USUARIO:
Ejemplo 1:
- 1
- Manolo Garcia
- man...@ci.com
- 4dg7
- buscar productos

Ejemplo 2:
- 2
- Pedro Picapiedra
- pe...@ci.com
- um4f
- nueva factura, listar facturas

En el primer caso tratamos con el personal que se encarga de ver
existencias y en el ejm2 el vendedor.

He minimizado el problema completo, sí logro hacer funcionar esto
entonces puedo usar lo mismo para todo el sistema =(

LA SOLUCIÓN QUE INTENTE IMPLEMENTAR

Tabla: Menu
- id_menu
- nombre_menu

Tabla: Menu: conDATOS
- 1 USUARIOS
- 2 PRODUCTOS
- 3 FACTURAS


Tabla: subMenu
- id_subMenu
- id_menu
- nombre_subMenu
- urlSubMenu

Tabla: subMenu: conDATOS
- 1 1(USUARIOS) Nuevo usuario usuario/nuevo_usuario
- 2 1(USUARIOS) Listar usuarios usuario/listar_usuario

- 3 2(PRODUCTOS) Nuevo producto producto/nuevo_producto
- 4 2(PRODUCTOS) Listar productos producto/
listar_producto
- 5 2(PRODUCTOS) Buscar productos producto/
buscar_producto

- 6 3(FACTURAS) Nueva factura factura/nueva_factura
- 7 3(FACTURAS) Listar facturas factura/listar_factura

Tabla: permiso
- id_usuario
- id_menu
- id_subMenu
- estado
Con eso consigo asociar determinado acción a determinado usuario:

Ejm:

id_usuario = 1
id_menu = 2 (PRODUCTOS)
id_subMenu = 5 (BUSCAR PRODUCTOS)
estado = 1

Lo que se me ocurre es hacer de alguna forma que al momento de crear
al usuario y darle permisos me cree todos (7) aunque esten en estado 0
porque en determinado momento se puede cambiar esos permisos.

id_usuario = 1
id_menu = 2 (porque esta en el menu de PRODUCTOS)
id_subMenu = 4 (LISTAR PRODUCTOS)
estado = 0
Con esto manolo podría listar los productos pero esta en estado 0 osea
no le va a mostrar el Menú y no podrá acceder.

PROBLEMAS!
Logré hacer funcionar esto pero se me presentaron los siguientes
problemas:

- No controlo verdaderamente los accesos, un usuario que no esta
autentificado no tiene acceso a ninguna parte de la aplicación, pero
un usuario autentificado sí. Que no vea el menú para acceder a
determinada parte no quiere decir que no pueda hacerlo ya que
escribiendo la URL directamente puede entrar :O :( entonces ahí
debería decirle que no tiene permisos para ingresar a ésa área.

La solución que se me ocurré es cargar en un array todos los
urlSubMenu con estado 1 y validar continuamente que la opción que
elige el usuario este dentro de sus permisos.

No se si me estoy haciendo BOLAS o me estoy ahogando en un vaso de
agua lo cierto es que mi nivel en CI es muy bajo y hay cosas que me
cuestan trabajo entender. Imagino que para los experimentados en esto
es muy facil de hacer por lo que por favor si podrían sugerirme alguna
solución más decente?, más práctica?, más facíl? o usar la que tengo
con importantes mejoras.

Gracias! estoy muy al pendiente del HILO si algo no se entiende estoy
ahí para dar más detalles.

Alejandro Ñañez Ortiz

unread,
Aug 25, 2010, 12:59:46 PM8/25/10
to codeignit...@googlegroups.com
Buenos días.

Y por qué no trabajas con sesiones? con eso solucionarías tu problema.


--
---
Para anular la suscripción a este grupo, envía un mensaje a
codeigniter-spa...@googlegroups.com
Para obtener más opciones, visita este grupo en
http://groups.google.com/group/codeigniter-spanish?hl=es.



--
Alejo Ñañez Ortiz

Juanmy

unread,
Aug 25, 2010, 1:03:37 PM8/25/10
to codeignit...@googlegroups.com
Creo que es simple, en el controller de la acción correspondiente consultas si el usuario (supongo que lo tendrás en una sesión) tiene permiso para esa acción, si es correcto sigues y si no le muestras un mensaje de error.

Según tu ejemplo: el usuario Manolo entre en listar submenu , bien pues en el controller que contenga la acción de listar_productos lo primero que haces es enviar una consulta con el id del usuario y el id del submenú y le preguntas el estado (esto lo metes en un modelo y te es más facil reutilizarlo).

linux.wow

unread,
Aug 25, 2010, 2:03:43 PM8/25/10
to CodeIgniter-spanish
@Alejandro sí estoy usando sessiones.
@Juanmy si hago eso ... identifico a los usuarios y cargo los menus
según a lo que se les asigno. Tengo un modelo que se encarga de
manejar los Menus y Submenus y según al estado que tiene determinado
usuario para ese subMenú: ejm: Listar facturas, estado = 1 entonces se
le carga el menú y puede acceder ahí. Mmm creo que va a ser muy
dificil entendernos xD ... por veo mi problema y no esta complicado de
hacer, el problema es que no tengo dominio de CI y me hago bolas al
usarlo para solucionar mi problema, =( entonces tengo que aprender CI

He encontrado varias aplicaciones hechas bajo CI estos los baje de
sourceforge.net y estan muy interesantes pero necesito conocimientos
medios para entenderlos, manejan sessiones, pero no encontré una de
ejemplo que haga lo que estoy queriendo.

Haber si alguien me avienta un poco de código! o haya visto alguna
aplicación similar a la que quiero hacer para darme una ídea de cómo
dar solución a mi problema. Gracias =(

Juanmy

unread,
Aug 25, 2010, 2:12:45 PM8/25/10
to codeignit...@googlegroups.com
Veamos cuando vas a listado de producto supongo que será algo como esto:

class productos extends controller {
    function __Construct() {
        parent::Controller();
        ...
    }
   
    funtion listar_productos(){
        if(!$this->seguridad_modelo->permiso($id_usuario,$id_subMenu)){
          //No tiene permiso lo redirijo
            redirect(...);
        }
        // sigo con el listado.
    }
}

Erik Rodriguez Chayña

unread,
Aug 25, 2010, 2:14:43 PM8/25/10
to codeignit...@googlegroups.com
Ufff! amigo si que estas en aprietos, tienes que aprender codeIgniter hasta la media noche y toda la madrugada tienes para termianr de desarrollar tu aplicación.

Lo importante es que tienes ídea de cómo podrías solucionar tu problema, pero veo que si te digo que hagas esto o aquello no lo harás :D porque se te hará dificil G_G así que mejor te paso código, tengo una amiga que hizo algo similar y podría facilitarte código para que veas como lo hizo el problema es que la no esta en línea y la llame por telefono y esta ocupada :P tas piña! así que sigue documentandote todo lo que puedas que dentro de unas horas te paso el código y no te preocupes que aquí en la lista hay muchos experimentados que te podrían facilitar código para que lo veas más claro :D suerte amigo y hasta luego.

PD: para que no sea en vano mi mensaje, lo que yo hago en estas situaciones. Es crear una librería para Login (validar a los usuarios con sesiones y todo), Menus (Que se encargen de manejar todo esto de los menus, desde esta librería jalo los modelos y valido datos, en tu caso validaría los estados.) y luego teniendo esto ya es cuestion de reutilizar estas librerías.

--
---
Para anular la suscripción a este grupo, envía un mensaje a
codeigniter-spa...@googlegroups.com
Para obtener más opciones, visita este grupo en
http://groups.google.com/group/codeigniter-spanish?hl=es.



--
Atte.
Rodriguez chayña, Erik
www.ErikROCHA.net

<<P431i7o>>

unread,
Aug 25, 2010, 2:27:31 PM8/25/10
to codeignit...@googlegroups.com
man, para hacer un abm, simple
puedes ver el video de derek allan que esta en lapagina de codeigniter
hay dos
aprender  http://codeigniter.com/tutorials/

aprende codeigniter en 20 minutos
y
construir un weblog en 20 minutos

muy instructivos

el primero tiene un sub que hice yo, hace muuucho tiempo este es el enlace http://codeigniter-spanish.googlegroups.com/web/intro.srt?gda=YELXtzsAAADoGXX6a7e_bV09O9eAf_9Hj2Q5rPFgz0Qc6DW_vlwuAC7IcNFJfGWUSB2VLdHcn7cGRdr3QrylPkw2aRbXD_gF
esta en los archivos de la pagina del grupo

Saludos Cordiales
---------------------------------------------
Pablo F.Ruiz Diaz Rios
Desarrollo Web con tecnologias de PHP, MySQL, AJAX (aunque tecnicamente ajax no es una nueva tecnologia,sino, la combinacion de varias)
messenger: http://tinymailto.com/p431i7omsn

PROTEGE TU RED:

     Compartimos mensajes. Así que POR FAVOR, si vas a realizar un reenvío de este correo o cualquier otro recibido, BORRA mi dirección de correo y todas las direcciones de correo que aparezcan en los textos.
    Proteje las direcciones de  tus amigos y la mía, enviando solo como CCO o BCC, Con copia oculta y NO PARA, ni CC: para evitar que usen nuestras direcciones y recibir correos no deseados, virus, spam etc.

linux.wow

unread,
Aug 25, 2010, 2:37:37 PM8/25/10
to CodeIgniter-spanish
@Juanmy entiendo!!!

Lo que me planteas es no ocultar los subMenus ejm: Lista productos,
sino que permito que puedan ver todo, pero cuando le hagan click ahí
es donde voy a validar si el usuario tiene permiso (Estado = 1) para
ese Submenu y de no ser así le muestro un mensaje de "No tiene
permisos"

Ahora por otro lado no podrán acceder de forma directa por el URL del
navegador, si otro usuario intruso pusiera esto en el navegador y este
no tiene permisos no podrá acceder :D [ http://..../index.php/listar_productos/1/4
]

Interesante gracias! ... ahora lo ídeal sería mostrarle justo las
opciones q puede ejecutar determinado usuario. Pero bueno esto vale
cómo una primera solución Thanks!

Haber si alguien me ilumina sobre cómo hacer funcionar esto mismo pero
que cuando el usuario se logee le muestre el acceso sólo a partes que
tiene como permitidas.

class productos extends controller {
function __Construct() {
parent::Controller();
$THIS->LOAD->MODEL(SEGURIDAD_MODELO);
}


funtion listar_productos(){
if(!$this->seguridad_modelo->permiso($id_usuario,$id_subMenu))
{
//No tiene permiso lo redirijo
redirect(...);
}
// sigo con el listado.
}



}


On 25 ago, 13:12, Juanmy <juanm...@gmail.com> wrote:
>   Veamos cuando vas a listado de producto supongo que ser� algo como esto:
>
> class productos extends controller {
>      function __Construct() {
>          parent::Controller();
>          ...
>      }
>
>      funtion listar_productos(){
>          if(!$this->seguridad_modelo->permiso($id_usuario,$id_subMenu)){
>            //No tiene permiso lo redirijo
>              redirect(...);
>          }
>          // sigo con el listado.
>      }
>
> }
>
> El 25/08/2010 20:03, linux.wow escribi�:
>
>
>
> > @Alejandro s� estoy usando sessiones.
> > @Juanmy si hago eso ... identifico a los usuarios y cargo los menus
> > seg�n a lo que se les asigno. Tengo un modelo que se encarga de
> > manejar los Menus y Submenus y seg�n al estado que tiene determinado
> > usuario para ese subMen�: ejm: Listar facturas, estado = 1 entonces se
> > le carga el men� y puede acceder ah�. Mmm creo que va a ser muy
> > dificil entendernos xD ... por veo mi problema y no esta complicado de
> > hacer, el problema es que no tengo dominio de CI y me hago bolas al
> > usarlo para solucionar mi problema, =( entonces tengo que aprender CI
>
> > He encontrado varias aplicaciones hechas bajo CI estos los baje de
> > sourceforge.net y estan muy interesantes pero necesito conocimientos
> > medios para entenderlos, manejan sessiones, pero no encontr� una de
> > ejemplo que haga lo que estoy queriendo.
>
> > Haber si alguien me avienta un poco de c�digo! o haya visto alguna
> > aplicaci�n similar a la que quiero hacer para darme una �dea de c�mo
> > dar soluci�n a mi problema. Gracias =(- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

iMefisto

unread,
Aug 25, 2010, 2:47:50 PM8/25/10
to codeignit...@googlegroups.com
No sé si estoy a tiempo o ya me cuelo tarde a la charla, pero esto es lo que entendí y lo que sugiero:

Cada usuario tendrá un nivel de permiso según el menú.
CUando un usuario pasa por el login, en alguna variable de sesión se guarda el nivel que ese usuario tiene.

Si eso es cierto, yo pondría en la vista que contiene el menú, algo así:

<?php if ($this->session->userdata('permiso')==1): ?>
//muestro el menú que tiene este permiso.
<?php endif;?>

y aplicar el mismo concepto a todos los menúes.

Además tenés que incorporar en cada controlador de las secciones no autorizadas (posiblemente en el mismo constructor) algo así:

//supongamos que x es el permiso para este controlador
if ($this->session->userdata('permiso')!=x) {
  redirect('algun controlador encargado de errores');
}







linux.wow

unread,
Aug 25, 2010, 4:34:48 PM8/25/10
to CodeIgniter-spanish
@Patito, Holas sí ví los videos de CI, lo que no ví son esos 141 msn
donde explican algunos aspectos básicos de CI y acabo de leerlos y si
esta muy interesante y muy básico. xD pero thanks! =

@iMefiesto, No aún no es tarde ... Creo que si entendiste en algo mi
pregunta, pero sería bueno que haya 3 cargos: Administrador (Tiene
acceso a todo el sistema), Vendedor (Tiene acceso a los módulos
relacionados con la venta) y Almacenero (Que tiene acceso a los
módulos que tienen que ver con ingresar existencias y demás) pero no
es así ... estoy es más flexible donde un administrador crea la cuenta
de usuario y le otorga permisos-> éjm: Tu podrás agregar productos y
podrás listar productos más no podrás facturar y menos crear usuarios.

Ahora lo que me planteas es guardar en una sessión todos urlSubMenu
(Permisos) que tengan como estado = 1 y tomo este cómo criterio para
poder filtrar los accesos. Interesante.

Aunque me muestras algo de código de cómo hacer funcionar esto no
logro digerirlo completamente. =( me documentaré ahorita mismo sobre
sessiones en CI
> >http://groups.google.com/group/codeigniter-spanish?hl=es.- Ocultar texto de la cita -

iMefisto

unread,
Aug 25, 2010, 4:48:29 PM8/25/10
to codeignit...@googlegroups.com


ejemplo: supongamos que vos querés mostrar el siguiente menú:

Esto sería el código de la view para ese menú:

<div>Menú ventas</div> <!-- solo para administrador y vendedores -->
<div>Menú almacén</div> <!-- solo para administrador y almacenero -->



supongamos que los permisos son:
usuario->urlSubMenu = 1 Admin
usuario->urlSubMenu = 2 vendedor
usuario->urlSubMenu = 3 Almacenero


el menu con permisos quedaría así:

<?php if ($this->session->userdata('urlSubMenu')==1 || $this->session->userdata('urlSubMenu')==2:?>
<div>Menú ventas</div> <!-- solo para administrador y vendedores -->
<?php endif;?>

<?php if ($this->session->userdata('urlSubMenu')==1 || $this->session->userdata('urlSubMenu')==3:?>
<div>Menú almacén</div> <!-- solo para administrador y almacenero -->
<?php endif;?>

y el mismo concepto lo aplicás al controlador de ventas y al controlador de almacén.


Reply all
Reply to author
Forward
0 new messages