2010-07-09 23 views
14

Estoy creando un sitio web en el que administraré a los usuarios y sus permisos. Estoy buscando implementar roles de usuario, y no puedo entender cómo deberían funcionar las cosas. Quiero poder asignarle a un usuario un determinado rol, y que cada rol contenga de uno a varios permisos que mi secuencia de comandos pueda leer fácilmente. Solo quiero saber cómo debo configurar la base de datos para hacerlo de manera fácil y eficiente.¿Cómo administrar roles de usuario en una base de datos?

En mi cabeza me imagino 3 tablas (usuarios, roles y permisos). Podría dar a cada usuario una identificación de rol que se una a la tabla de roles, simplemente no sé cómo puedo vincular las funciones a varios permisos.

Respuesta

35

Simplemente no sé cómo puedo vincular los roles a varios permisos.

se utiliza una tabla de unión: ROLE_ID y permission_id identificar qué permisos están asociados con qué papeles

EDIT:

Ejemplo tablas

PAPEL Tabla

Role_ID Role_Name 
1  Standard User 
2  Super User 
3  Guest 

PERM Tabla ISIÓN

Permission_ID Permission_Name 
1    View User List 
2    Update Own User Account 
3    Update Any User Account 

ROLE_PERMISSION Tabla

Role_ID Permission_ID 
1  1 // Role 1 (Standard User) grants View User List 
1  2 //  and Update Own User Account 
2  1 // Role 2 (Super User) grants View User List, 
2  2 //  Update Own User Account, 
2  3 //  and Update Any User Account 
3  1 // Role 3 (Guest) grants View User List 

Listado de los permisos para un determinado ROLE_ID

select R.role_id, 
     P.permission_id, 
     P.permission_name 
    from role R, 
     permission P, 
     role_permission RP 
where RP.permission_id = P.permission_id 
    and RP.role_id = R.role_id 
    and R.role_id = 1 
+0

Impresionante. Muchísimas gracias chicos. –

+8

+1 Gran ejemplo. Creo que muchos usuarios que buscan este tipo de información harán referencia a esta publicación. –

+0

Gracias @Mark, excelente ayuda. Ahora, digamos que tengo un Diseñador gráfico de roles y no tiene permiso para ver el perfil de Anyones, excepto el suyo. Le he asignado un usuario para que se ocupe de él y necesita acceder al perfil del usuario. ¿Cómo puedo almacenar en la base de datos que tiene el derecho de ver cualquier perfil al que se le haya asignado? –

0

Si quieres ir a la ruta de las 3 mesas, podría crear sus tablas como tal:

Table  | Rows 
User  | id ; name ; dob ; permission_id ; etc... 
Roles  | id ; add_post ; edit_post ; delete_post ; add_user ; etc... 
Permissions | id ; user_id ; role_id 
4

Esta es la forma en que normalmente lo que hago:

se define un conjunto de permisos cuyo significado varía de un objeto de destino para apuntar objeto, pero cuyo significado general es la misma. Por ejemplo:

  • leer
  • escritura
  • append
  • eliminar
  • eliminar el contenido de
  • permisos de lectura
  • cambiar permisos

A continuación, se asigna un bit a cada de ésos:

class Perms { 
    const read   = 1; 
    const write   = 2; 
    const append   = 4; 
    const delete   = 8; 
    const deleteContents = 16; 
    const readPerm  = 32; 
    const changePerm  = 64; 
    /* shortcuts */ 
    const fullControl = 127; 
    const noControl  = 0; 
} 

Luego, para cada tipo de objeto que tiene una tabla donde se inserta pares (user, perms), (group, perms), (role, perms) o lo que desea asociar con los permisos.

Puede consultar los permisos del usuario (que puede tener varios roles) como este:

//this will depend on the database 
//you could also use whatever bitwise OR aggregate your database has 
//to avoid the foreach loop below 
$query = new Query(
    "select perm from objects_permissions as P ". 
    "where P.id_object = \$1 and " . 
    " (P.role = any(\$2));", 
    $obj->getId(), $user->getRoles() 
); 

$perms = 0; 
foreach ($query as $row) { 
    $perms |= $row['perm']; 
} 

También puede agregar niegan permisos con poca dificultad.

+0

Confieso que estoy usando un mecanismo similar para definir el acceso del usuario a los objetos dentro de una aplicación; pero un mecanismo de usuario/función/permiso similar al solicitado por el OP para acceder a la funcionalidad general de UI (por ejemplo, permiso UPLOAD_FILE) –

+1

@Mark Mi enfoque es generalizar. Si necesito controlar el acceso para cargar archivos, defino un "contenedor de archivos cargados" y otorgo a los usuarios permisos de 'anexar' en dicho objeto. A continuación, puede agregar fácilmente otros permisos relacionados, por ejemplo, 'deleteContents' en ese contenedor podría permitir la eliminación de archivos cargados,' read' permitiría descargar archivos o listarlos, etc. – Artefacto

4

Creo que el operador bit a bit es la mejor forma de implementar el permiso del usuario. Aquí estoy mostrando cómo podemos implementarlo con Mysql.

a continuación es una tablas de ejemplo con algunos datos de muestra:

Tabla 1: mesa de Permiso para el permiso nombre de la tienda junto con él poco como 1,2,4,8..etc (múltiplo de 2)

CREATE TABLE IF NOT EXISTS `permission` (
    `bit` int(11) NOT NULL, 
    `name` varchar(50) NOT NULL, 
    PRIMARY KEY (`bit`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Inserte algunos datos de muestra en la tabla.

INSERT INTO `permission` (`bit`, `name`) VALUES 
(1, 'User-Add'), 
(2, 'User-Edit'), 
(4, 'User-Delete'), 
(8, 'User-View'), 
(16, 'Blog-Add'), 
(32, 'Blog-Edit'), 
(64, 'Blog-Delete'), 
(128, 'Blog-View'); 

Tabla 2: mesa usuario almacenar la identificación del usuario, nombre y función. El rol se calculará como la suma de permisos.
Ejemplo:
Si el usuario 'Ketan' tiene permiso de 'User-Add' (bit = 1) y 'Blog-Delete' (bit-64), entonces el rol será 65 (1 + 64).
Si el usuario 'Mehata' tiene permiso de 'Blog-View' (bit = 128) y 'User-Delete' (bit-4), entonces el rol será 132 (128 + 4).

CREATE TABLE IF NOT EXISTS `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    `role` int(11) NOT NULL, 
    `created_date` datetime NOT NULL 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Muestra Data-

INSERT INTO `user` (`id`, `name`, `role`, `created_date`) 
    VALUES (NULL, 'Ketan', '65', '2013-01-09 00:00:00'), 
    (NULL, 'Mehata', '132', '2013-01-09 00:00:00'); 

permiso Loding de usuario Después de inicio de sesión si queremos cargar el permiso del usuario de lo que podemos consultar aquí para obtener los permisos:

SELECT permission.bit,permission.name 
    FROM user LEFT JOIN permission ON user.role & permission.bit 
WHERE user.id = 1 

Aquí usuario .role "&" permission.bit es un operador Bitwise que dará salida como -

User-Add - 1 
Blog-Delete - 64 

Si queremos comprobar el tiempo de un usuario en particular tienen fácil de permisos de edición o no-

SELECT * FROM `user` 
    WHERE role & (select bit from permission where name='user-edit') 

salida = No hay filas.

Puedes ver también: http://goo.gl/ATnj6j

Cuestiones relacionadas