[alert type=»info»]Lectura obligada antes de leer este post: Permisos de usuario usando bitwise PHP[/alert]

Me acaban de preguntar como pudieran hacer para seleccionar individualmente permisos para cada usuario ( basándonos en este post ) ( o al menos fue lo que entendí ), voy a proponer una forma de hacerlo, pero recuerden que no es única, es solo para que se puedan dar una idea de como pudieran hacerlo.

Pensemos en las siguientes tablas de una base de datos:

Permisos de usuario

Tenemos nuestra tabla de usuarios de toda la vida, una tabla de permisos y una tabla para relacionar permisos con usuarios, bien, lo primero que tenemos que tener en cuenta es llenar nuestra tabla de permisos con nuestros valores, algo similar a esto ( Recuerden basarse en el post de permisos en bitwise ):

id descripción valor
1 Leer 1
2 Escribir 2
3 Borrar 4

Cada permiso tiene su propio ID asociado.

¿Qué nos queda por hacer?

Guardar registros 🙂 , si queremos que el usuario con id 1 tenga permiso para leer solo ingresamos a la BD

INSERT INTO permisos_usuario SET id_usuario = 1, id_permiso = 1

Tomando en cuenta que el permiso con id 1 = leer, así podemos asignarle permisos individuales a cada usuario.

¿Qué permisos tiene cada usuario?

De nuevo solo una consulta a la BD

SELECT id_permiso FROM permisos_usuario WHERE id_usuario = {ID_DEL_USUARIO}

Nos devolverá todos los permisos que tiene el usuario, simulemos en PHP el ciclo para definir el valor final de los permisos del usuario ( supongamos que ya tenemos en un array los permisos regresados por la BD, 1 en cada ciclo ):

$permisos_finales = null; 
foreach($permisos AS $permiso) { 
    if (is_null($permisos_finales)) { 
        $permisos_finales = $permiso; 
        continue; 
    } 
    $permisos_finales |= $permiso;; 
}

Al final tendremos los permisos para ese usuario justo en $permisos_finales listo para poder comparar con los permisos que necesitemos de nuestra aplicación, para lo que de nuevo recomiendo hacer una clase con nuestros permisos ( si, los mismos que definimos en la BD con todo y sus valores los tenemos que tener en nuestra clase PHP ), para este ejemplo pongo una clase de ejemplo ( valga la redundancia XD ):

class Permisos {
    const LEER = 1;
    const ESCRIBIR = 2;
    const ELIMINAR = 4;

    function tiene_permiso( $permisos_actuales, $permiso_requerido ) {
        return $permisos_actuales & $permiso_requerido;
    }
}

¿Y para usarla?

Un ejemplo rápido ya «funcionando» ( tomen en cuenta que estamos pasando por alto muchas cosas que deben implementar según sea su aplicación ):

require_once('Permisos.class.php');

$id_usuario = 3; // Mero ejemplo hardcodeado
$permisos = get_permisos( $id_usuario ); // Ustedes deben definir esta función en base a su aplicación

$permisos_obj = new Permisos();
if ( $permisos_obj->tiene_permiso($permisos, Permisos::ELIMINAR) ) {
    eliminar_algo(); // ejemplo, esto lo definen ustedes
}
else {
    die('Tu no tienes permisos para eliminar ese item');
}

Recuerden que damos muchas cosas por sentado, pero es solo para dar una idea de como aplicar lo que un amigo nos pregunto, el como definir permisos independientes para cada usuario y no usar «perfiles» de permisos y recuerden que meramente es una idea de como se podría hacer.

Y si se me ha pasado algo o estoy me equivoqué con algo, genial si me lo dicen para que entre todos podamos corregirlo.

Un saludo a todos.