¿Como restringir a los usuarios el acceso a diferentes partes de una aplicación?

Hola, a raíz de una duda que surgió con algunos usuarios sobre como se podía restringir el acceso de alguna parte de nuestra aplicación a los usuarios que estuviesen registrados en la misma, voy a escribir este tutorial explicando como es que se puede hacer, y es muy sencillo, se hace mediante privilegios, creo que esta es la clave y cualquier sistema lo tiene implementado ya sea de una forma u otra. Desconozco si existe alguna librería en codeigniter para esto, pero por lo pronto vamos a hacer esta funcionalidad nosotros mismos.

Lo primero es empezar con la base de datos, debemos tener una tabla que se llame privilegios, otra miembros, otra pudiese ser productos y la ultima que puede ser opcional sería ci_sessions, esta tabla se usa para guardar los datos de sesión del usuario y después trabajar con ellos. El código sería así:

Los privilegios pueden ser cualquier tipo, ya sea administrador, consultor, invitado, el que ustedes definan, y por supuesto que cada usuario tendrá asignado un privilegio, de ahí que se necesario una relación de 1 a 1 con la tabla miembros, también pudiese tener una relación de 1 a muchos si así lo creen conveniente.

Supongamos que en nuestro sitio tenemos las siguientes secciones: Usuarios y Productos.

Ahora definamos los tipos de privilegios,  el privilegio 1 seria el de Administrador, este podría insertar, actualizar, eliminar y listar Usuarios y Productos, el privilegio 2 sería el de Consultor, este solamente puede listar los productos y actualizar su usuario, pero no va a poder ver a los demás, solamente así mismo; tanto el administrador como el consultor van a ser usuarios del sistema lo que cada uno con un nivel distinto de privilegios.

Pasaremos ahora a restringir el acceso a nivel de vista, es decir, vamos definir que nivel de privilegios puede ver los usuarios y los productos.

Lo primero es decir que si un usuario no está registrado no va a poder ver la sección de productos ni la de usuarios, seria así.

En caso de que quisiéramos que un el consultor no vea la sección de Usuarios habría que poner lo siguiente:

con esto decimos que si el usuario está registrado y es administrador va a poder ver a los usuarios mientras que cualquier otro no va a poder, de esta forma el consultor no va a poder acceder a los usuarios aunque esté registrado, ya que su privilegio no se lo permite.

Si se fijaron al principio definí que tanto los Administradores, como los Consultores podría ver la sección de Usuarios y Productos estando logueados en el sistema, ahora vamos a ver como se hace para que los consultores no puedan modificar la información de otros usuarios pero si la de ellos, y esto se hace en la clase controladora.

Hice una clase controladora que se llamara cc_main, esta se va a encargar  de comprobar el login de los usuarios, asi como de mostrarlos y demás, y quedaría de la siguiente forma:

Si se fijan en la función usuario_management() que es la encargada de manejar a los usuarios, está el siguiente pedazo de código:

esto quiere decir que si el usuario esta logueado, pero su privilegio no es el de administradror le quito el permiso de insertar y eliminar con $crud->unset_add() y $crud->unset_delete(); pero si le mantengo el de actualizar, la linea $crud->fields(‘username’, ‘password’) lo que hace es que nada mas le muestra el campo nombre de usuario y contraseña, ya que tambien existe un campo que es el de privilegios, pero este campo solo lo pueden ver los administradores, y con la línea $crud->where(‘id_miembro’, $this->session->userdata[‘id_miembro’]) le estoy diciendo que muestre el nombre del usuario que esté logueado en ese momento.

Hay otra clase que la llame cc_sistema, que es la que se encarga de manejar los productos y sería esta:

En la función productos_management() hay unas lineas de codigo que son:

y

El primer if lo que hace es una medida de seguridad, porque puede darse el caso de que usted tenga la sesión abierta y en algún despiste otro usuario copia la url  para después que usted se vaya el poner la url y entrar a ver los productos, pues esto es para que cuando usted cierre sesión y se vaya cuando el malhechor ponga la dirección y presione Enter, al no estar logueado lo redirecciona para el inicio de la pagina.

El segundo if es el que hace el consultor no pueda ni insertar, actualizar ni eliminar algun producto, ya que si el usuario que esta logueado tiene un privilegio distinto de el de administrador le eliminar todas las operaciones que se pueden hacer en la tabla productos, y solamente va a poder ver los productos que hay pero sin poder modificarlos.

Con esto he finalizado este tutorial, aquí les dejo este proyecto para que lo puedan descargar example_permisos en el proyecto hay otras funcionalidades como son la de hacer una salva a la base de datos y un pequeño sistema de trazas..

El proyecto se hizo usando Codeigniter 2.1, Grocery_crud 2.1, MySQL 5.5.29 y Twitter Bootstrap 2.0.3

Espero que este tutorial les ayude en sus futuros proyectos, esta no es la única forma de hacerlo, pero por lo menos tienen una idea.

saludos

Escrito por luckys

Estudio Ingeniería Informática en la Universidad de Las Palmas, España.