Pregunta

He empezado a desarrollar una aplicación de foro en PHP en mi MVC Framework y tengo a la etapa en la que asignar permisos a los miembros. (Por ejemplo: leer, escribir, actualizar, eliminar)

Ahora, sé que puedo añadir 5 columnas debajo de la mesa usuario en mi base de datos y los pone a 1 | 0, pero eso me parece demasiado si quiero añadir otras normas, como por ejemplo MOVER.

Y cómo puedo asignar dinámicamente estos privilegios a los usuarios de forma individual?

He oído de usar una máscara de bits, pero sería muy bueno si pudiera entender completamente antes de continuar.

¿Tiene un ejemplo de cómo podría implementar esto?

¿Fue útil?

Solución

El método que describes - privilegios individuales almacenados en columnas -. Es sencillo, a expensas de la flexibilidad (Como habrá notado)

El método de Zuul es aún más simple y esencialmente el mismo que el suyo, salvo que evita la necesidad de las manifestaciones "ALTER TABLE". Sin embargo, no se normaliza, no consultable fácilmente y no auto-documentado.

Otro problema con estos dos métodos es que a medida que crece su base de usuarios, le resultará cada vez más de un dolor de mantener los privilegios de todo el mundo establecen correctamente. Usted se encontrará con una gran cantidad de usuarios que necesitan exactamente los mismos privilegios. Sin embargo, con el fin de cambiar los privilegios de un usuario, como para dar cabida a un nuevo privilegio, tendrá que entrar y añadir que el privilegio de cada usuario que lo necesita de forma individual. PITA importante.

En un foro, no es probable que necesitará gestión de privilegios de cada usuario. Lo más probable es que tendrá ciertas clases de usuarios como usuarios anónimos, usuarios registrados, moderadores, administradores, etc. Esto haría muy adecuado para el control de acceso basado en roles (RBAC). En este sistema que asignará a cada usuario a una función, y otorgar privilegios para el papel. Privilegios se almacenan como filas de una tabla "privilegio". por lo que el esquema de base simplificada se vería así:

PRIVILEGE
int id (primary key)
varchar description

ROLE_PRIVILEGE_JOIN
privilege_id (foreign key)
role_id (foreign key)

ROLE
int id (primary key)
varchar description

USER
int id (primary key)
int role_id (foreign key)

Este patrón se utiliza en muchas aplicaciones que tienen que ver con los privilegios del usuario. Añadir todos los privilegios que cualquier persona podría tener como una fila en la tabla de privilegios; añadir todos los papeles que cualquier usuario podría tener en la tabla de papel; y vincularlos debidamente en el índice role_privilege_join.

La única desventaja real es que debido a que una tabla de unión se utiliza, el "Usuario X pueden hacer Y" consulta va a ser algo más lento.

Otros consejos

A permisos máscara de bits se entiende mejor cuando se representa como binarios, con cada dígito que representa un permiso de ser encendido o apagado. Así que si los permisos X, Y y Z existen, y sólo tienen acceso a X y Z, 101 representaría que tengo el primer y tercer permisos concedidos a mí, pero no el segundo. El número 101 binario es equivalente al número decimal 5, así que es lo que terminaría almacenada en la base de datos. Un solo, pequeño número entero es un objeto mucho más eficiente a la tienda de una cadena o de varios números enteros pequeños.

EDIT: Me di cuenta de lo fácil que era para las funciones de conversión existentes apalancamiento para obtener una rápida implementación bastante ir. He aquí una muestra.

<?php
function bitmask_expand($n) {
  // 9 returns array(1, 0, 0, 1)
  return str_split(base_convert($n, 10, 2));
}

function bitmask_compact($a) {
  // array(1, 0, 0, 1) returns 9
  return (int) base_convert(implode($a), 2, 10);
}

$ns = range(0, 7);
foreach($ns as $n) {
  print_r($b = bitmask_expand($n));
  echo bitmask_compact($b), "\n\n";
}

Se puede obtener un mejor rendimiento si utiliza bucles, en lugar de tirar hacia atrás desde y hacia las cadenas, pero esto ilustra el principio con bastante claridad.

Yo crearía una tabla llamada "Roles":

CREATE TABLE Roles(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY(id),
 rolename VARCHAR(30))

Palillo lo permisos desea allí. A continuación, cree una tabla llamada "UserRoles" a los usuarios a los roles de enlace:

CREATE TABLE UserRoles(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY(id),
 UserId INT,
 RoleID INT)

Las porciones de flexibilidad y fácil de construir sobre (es decir, flujo de trabajo, reglas, etc.) (Me gustaría añadir claves externas también)

no es necesario complicar eso, sólo tiene que utilizar un campo "ex": permisos y hacer algo como:

$ permisos = "1; 1; 0; 1";

donde en su preocupación se lee:

LEER - 1 (CAN)

WRITE - 1 (can)

ACTUALIZACIÓN - 0 (no se puede)

DELETE - 1 (CAN)

A continuación, en la comprobación, sólo tiene que utilizar "explotar" por ";" ...

De esta manera, siempre se puede aplicar tipos más permisos sin cambiar su mesa ... de este modo se obtiene la tabla más pequeña, y la consulta más rápido!

Es una solución para su problema:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top