You are on page 1of 10

Roles y perfiles

Un sistema de roles y usuarios podramos definirlo como la clasificacin de privilegios de


operacin en nuestro sistema, para entenderlo un poco mejor tendramos que
enumerar y explicar lo siguiente;
Usuarios: son los que interactan con nuestro sistema a los cuales debemos
controlar para validar que pueden o no hacer.
Perfiles: son los roles que se le asignaran o negaran a un usuario para conceder
privilegios en el sistema.
Recursos: son las zonas en las que dividiremos la aplicacin por ejemplo: crear
usuario, listar notas, eliminar notas, etc...
Por ltimo los permisos son las acciones concretas que se asignan sobre uno o
ms recursos del sistema.
Partiendo de esta base daremos solucin al siguiente problema.
Tenemos una editorial donde actualmente trabajan unas 50 personas, para el caso se
realizan las siguientes actividades.
Unos usuarios pueden registrar noticias.
Unos usuarios pueden editar noticias.
Unos usuarios pueden publicar las noticias.
Unos usuarios pueden registrar clientes.
Por ultimo un grupo de usuarios pueden hacer todo.
Para resolver este problema se necesitaran los siguientes perfiles.
Administrador: tendra permisos para hacer todo en la aplicacin
Periodista: seran los encargados de registrar las noticias pero no publicarlas.
Auditor: seran los que pueden editar y publicar las noticias
Vendedor: estos seran los que registraran los clientes en el sistema.
Con esto en mente podra plantear el siguiente modelo relacin.

En un proximo post explicare integrar todo este desde PHP y Mysql


Como quedamos en el captulo anterior, se plante un modelo entidad relacin que nos
permite validar los permisos de un usuario sobre los recursos del sistema el siguiente
paso es construir las clases necesarias para que nuestro sistema funcione.

1. _ creamos la base de datos con el nombre usuarioPerfil

Segundo ejecutamos el siguiente script para definir las tablas de nuestro sistema segn
el modelo propuesto.
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
-- ------------------------------------------------------ Table `usuarios`
-- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `usuarios` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT 'LLave primaria de la tabla' ,
`nombre` VARCHAR(100) NULL COMMENT 'Nombre completo del usuario' ,
`email` VARCHAR(75) NULL COMMENT 'Login del usuario' ,
`password` VARCHAR(45) NULL COMMENT 'Clave del usuario' ,
`fecha_registro` DATETIME NULL COMMENT 'Fecha en la que se registro el
usuario' ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
-- ------------------------------------------------------ Table `perfiles`
-- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `perfiles` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT 'llave primaria de la tabla' ,
`nombre` VARCHAR(45) NULL COMMENT 'Descripcin del perfil' ,
`fecha_registro` DATETIME NULL COMMENT 'fecha de registro' ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
-- ------------------------------------------------------ Table `usuarios_perfiles`
-- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `usuarios_perfiles` (
`usuario_id` INT NOT NULL ,
`perfil_id` INT NOT NULL ,
INDEX `fk_usuarios_perfiles_usuarios_idx` (`usuario_id` ASC) ,
INDEX `fk_usuarios_perfiles_perfiles1_idx` (`perfil_id` ASC) ,
CONSTRAINT `fk_usuarios_perfiles_usuarios`
FOREIGN KEY (`usuario_id` )
REFERENCES `usuarios` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_usuarios_perfiles_perfiles1`
FOREIGN KEY (`perfil_id` )
REFERENCES `perfiles` (`id` )
ON DELETE NO ACTION

ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- ------------------------------------------------------ Table `noticias`
-- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `noticias` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT 'llave primaria de la tabla' ,
`usuario_id` INT NOT NULL COMMENT 'usuario que crea la noticia' ,
`titulo` VARCHAR(75) NULL COMMENT 'Titulo de la noticia' ,
`descripcin` MEDIUMTEXT NULL COMMENT 'cuerpo de la noticia' ,
`fecha_registro` DATETIME NULL COMMENT 'Fecha en la que se registro la
noticia' ,
`fecha_modificacion` DATETIME NULL COMMENT 'Fecha de la ultima modificacin' ,
`estado` TINYINT(1) NULL COMMENT 'estado de la noticia' ,
PRIMARY KEY (`id`) ,
INDEX `fk_noticias_usuarios1_idx` (`usuario_id` ASC) ,
CONSTRAINT `fk_noticias_usuarios1`
FOREIGN KEY (`usuario_id` )
REFERENCES `usuarios` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- ------------------------------------------------------ Table `clientes`
-- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `clientes` (
`id` INT NOT NULL AUTO_INCREMENT,
`usuario_id` INT NOT NULL ,
`nombre` VARCHAR(45) NULL ,
`fecha_nacimiento` VARCHAR(45) NULL ,
`email` VARCHAR(45) NULL ,
`telefono` VARCHAR(45) NULL ,
`fecha_registro` VARCHAR(45) NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_clientes_usuarios1_idx` (`usuario_id` ASC) ,
CONSTRAINT `fk_clientes_usuarios1`
FOREIGN KEY (`usuario_id` )
REFERENCES `usuarios` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- ------------------------------------------------------ Table `recursos`
-- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `recursos` (
`id` INT NOT NULL ,
`nombre` VARCHAR(100) NULL COMMENT 'nombre del recurso' ,
`fecha_registro` DATETIME NULL COMMENT 'Fecha en la que se registro el
recurso' ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
-- ------------------------------------------------------ Table `perfiles_recursos`
-- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `perfiles_recursos` (
`consultar` TINYINT(1) NULL DEFAULT 0 ,

`agregar` TINYINT(1) NULL DEFAULT 0 ,


`editar` TINYINT(1) NULL DEFAULT 0 ,
`eliminar` TINYINT(1) NULL DEFAULT 0 ,
`recurso_id` INT NOT NULL ,
`perfil_id` INT NOT NULL ,
INDEX `fk_perfiles_recursos_recursos1_idx` (`recurso_id` ASC) ,
INDEX `fk_perfiles_recursos_perfiles1_idx` (`perfil_id` ASC) ,
CONSTRAINT `fk_perfiles_recursos_recursos1`
FOREIGN KEY (`recurso_id` )
REFERENCES `recursos` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_perfiles_recursos_perfiles1`
FOREIGN KEY (`perfil_id` )
REFERENCES `perfiles` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Ingresamos a phpMyAdmin a la tabla perfiles para registrar los siguientes perfiles


administrador, vendedor, periodista y auditor.

Ahora ingresamos a la tabla recursos para registrar los elementos que deseamos
controlar para el caso deberamos tener algo como la siguiente imagen.

Ingresamos a la tabla perfiles_recursos y estructuramos los permisos de cada perfil


sobre los recursos que definimos anteriormente.

Luego crearemos los usuarios del sistema a los cuales les asignaremos uno o ms
perfiles a travs de la tabla usuarios_perfiles una vez todo completo debera
quedarnos de esta manera.

Finalizando con todo lo relacionado con nuestra base de datos vamos a crear las clases y
archivos necesarios para que el sistema de validacin funcione correctamente.
1. Crearemos un directorio con el nombre configuracin podremos aqu
guardaremos los datos para ingresar a la base de datos.
2. un segundo directorio con el nombre clases donde guardaremos todo lo
relacionado con las clases de nuestro sistema.
3. Por ultimo un archivo index.php para llamar los clases y probar nuestro sistema
de permisos.
nuestro directorio nos deberia quedar de la siguiente manera.

archivo de configuracin /configuracion/db.inc.php

/**
* Configuracin de la base de datos
*
* Define la configuracin para la base de datos
*
*
* @category
Configuracion
* @package
base de datos
* @copyright Copyright (c) 2014-2015 ingenieroweb.com.co
* @version
$Id:$
*/
/**
* url de la base da datos
*/
DEFINE('DB_HOSTING','localhost');
/**
* Usuario para la base de datos
*/
DEFINE('DB_USUARIO','root');
/**
* Contrasea de la base de datos
*/
DEFINE('DB_CLAVE','');
/**
* Base de datos
*/
DEFINE('DB','usuariosperfil');

Iniciaremos por la clase de clases/class.conexin.php


<?php
/**
* Clase de conexin
*
* Clase para gestionar la conexion a la base de datos
*
* @category
Configuracion
* @package
base de datos
* @copyright Copyright (c) 2014-2015 ingenieroweb.com.co
* @version
$Id:$
*/
class Conexion {
private $conexion;
private $consulta;
/**
* Contructor que inicia la conexion
*/
public function __construct (){
$this->conexion = mysql_connect (DB_HOSTING,DB_USUARIO,DB_CLAVE);

mysql_select_db(DB);

/**
* funcion que ejecuta una consulta sql
* @param $Sql
*/
public function query($sql){
$this->consulta = mysql_query($sql);
}
/**
* funcion que retorna el resultado de una consulta en objetos
*/
public function obtenerObjeto(){

return mysql_fetch_object($this->consulta);

/**
* Funcion que finaliza la conexion a la base de datos
*/
public function desconectar () {
mysql_close($this->conexion);
}
}

ahora la clase permisos la cual tiene la logia para la validacin de los


permisos clases/class.permiso.php
<?php
/**
* Clase Permiso
*
* Clase para validar los permiso de un usuario sobre un recurso del sistema
*
* @category
Configuracion
* @package
base de datos
* @copyright Copyright (c) 2014-2015 ingenieroweb.com.co
* @version
$Id:$
*/
class Permiso extends

Conexion {

public function __construct (){


parent::__construct();
}
/**
* Funcion que retorna los permisos de un recurso
*
* @param int $usuario_id
* @param int $recurso_id

* @return object|stdClass
*/
public function validarPermiso ($usuario_id = 0,$recurso_id=0){
$sql = '
/* VALIDO LAS ACCIONES DE UN USUARIO SOBRE UN RECURSO DEL SISTEMA

*/

SELECT IF(SUM(consultar) >= 1, 1,0) as consultar,


IF(SUM(agregar) >= 1, 1,0) as agregar,
IF(SUM(editar) >= 1, 1,0) as editar,
IF(SUM(eliminar) >= 1, 1,0) as eliminar
FROM perfiles_recursos
WHERE recurso_id = '.(int)$recurso_id.'
AND perfil_id IN (
/* SELECCIONO LOS PERFILES DEL USUARIO*/
SELECT perfil_id
FROM usuarios_perfiles
WHERE usuario_id = '.(int)$usuario_id.'
)
GROUP BY recurso_id';
$this->query($sql);
return $this->obtenerObjeto();
}
}

Archivo index.php que seria como nuestro controlador.


<?php

/**
* Incluyo las librerias necesarias
*/
include('configuracion/db.inc.php');
include('clases/class.conexion.php');
include('clases/class.permiso.php');
/**
* Instanciamos la clase de permisos
*/
$obj_permiso = new Permiso();
/**
* Le pasamos el id del usuario y el recuros a validar
*/
$permiso = $obj_permiso->validarPermiso(1,1);
/**
* Validamos si el usuario puede crear una noticia
*/
if( $permiso->agregar == 1){
/**

* Logica para crear las noticias


*/
}
$obj_permiso->desconectar();

Ahora con nuestro sistema completo podremos llegar a validar los permiso de cualquier
usuario de acuerdo al conjunto de perfiles que este tenga, espero les sea de utilidad.

You might also like