Sistema de permisos con PHP

Iniciado por Alex_bro, 9 Agosto 2009, 16:42 PM

0 Miembros y 1 Visitante están viendo este tema.

Alex_bro

Buenas,
Antes de todo, gracias por sus ayudas en los post anteriores.
Hasta ahora he estado comprobando permisos con un campo en la DB con el nivel del usuario... pero ahora necesito asignar diferentes niveles (Lectura, escritura, borrar) por cada modulo, y si son unos 12 modulos por ejemplo, no creo que la solucion sea crear 36 columnas en una tabla de mysql...
He leido por ahi, que puede hacerse utilizando la comparacion a bit de php, pero realmente no lo entendi demasiado bien.
Cual es el metodo mas optimo y flexible (cada cuenta tendra unos modulos u otros) que puedo utilizar?
Mil gracias.
Saludos.

SnakeDrak

Hola,

Utiliza bitwise, ejemplo:

Código (php) [Seleccionar]

$escribir = 1;
$leer = 2;
$eliminar = 4;
$banear = 8;

$level = array ('Admin' => $escribir | $leer | $eliminar | $banear, 'Anonimo' => $leer);


Entonces en la DB solo tienes que tener una columna, la columna level o como quieras y pones a cada uno el nivel, por ejemplo Admin, entonces para comprobarlo:

Código (php) [Seleccionar]

// $NIVEL es el valor de la columna level
if($level[$NIVEL] & 1) echo "Puede escribir";
if($level[$NIVEL] & 2) echo "Puede leer";
if($level[$NIVEL] & 4) echo "Puede eliminar";
if($level[$NIVEL] & 8) echo "Puede banear";
// En caso de Admin los cuatro if se cumplirían y en caso de Anonimom solo se cumpliría el primero


Más información: http://es.php.net/manual/en/language.operators.bitwise.php

Saludos!
Más información:

^Cloud^

A mi siempre me ha gustado usar algo como un ACL. Por un lado defino los permisos, por otro perfiles y por ultimo asigno a usuarios perfiles.


$perms = array('lectura', 'escritura', 'borrado');
$roles = array('admin', 'anonimo', 'logado');
$roles_perm = array('admin' => array('lectura', 'escritura','borrado'), user => array('lectura'));
$user = array('name' => 'pepito', 'roles' => array('logado','admin'));

global $user,$roles_perm;

function control_access($perm = FALSE) {
  global $user,$roles_perm;
  $roles = $user['roles'];
  foreach ($roles as $key => $value) {
    $perms = $roles_perm($value);
    if (in_array($perm,$perms)) {
       return TRUE;
    }
  }
  return FALSE;
}

...

if (control_access('escritura')) {

....

}

Lo acabo de hacer de cabeza en este momento por lo que no se si funciona el código... pero vamos, es para que pilles la idea de como funcionaria un sistema de acl cutre.
Ahora resulta que imagino mi pasado
y llevo en esta clínica cuarenta años.
Nunca jamás he pisado la calle
y el electroshock ha sido mi padre

Alex_bro

Muchisimas gracias, reconozco el tiempo que lleva escribir posts tan completos como los vuestros.
Me habeis aclarado la idea de como sera finalmente el sistema de usuarios que hare. Un sistema ACL (Access Control List) utilizando bitwise como comenta SnakeDrak, quien por cierto explica muy bien  ;)

Gracias y un abrazo.