2010-05-11 9 views
11

Una vez vi un artículo sobre cómo usar un tipo específico de sistema de numeración para administrar roles. A un usuario se le asignaría un número de rol específico y, dependiendo de un cálculo, el número podría representar múltiples roles.PHP: ¿Administra roles con matemática?

¿Alguien puede compartir esta técnica conmigo o compartir un enlace? ¡Gracias!

+0

no sé sobre php pero en UNIX, lo usan, ¿verdad ¿Quieres tener una respuesta en el sistema Unix? – vodkhang

Respuesta

20

Es una máscara de bits. Funciona de esta manera: le asigna a cada función un número progresivo, luego cuando desea asignarle un rol a un usuario, elige el número de ese rol. Si desea agregar otro rol, simplemente agregue ese número de rol al original. Puede agregar tantos roles como desee. El truco es simplemente cómo usted elige sus números: son las potencias de 2.

Aquí está un ejemplo:

 
Role: Editor.  Value: 2^0 = 1 
Role: Manager. Value: 2^1 = 2 
Role: Supervisor. Value: 2^2 = 4 
Role: Admin.  Value: 2^3 = 8 
... 

Para dar a un usuario la función de editor, se ahorra 1 a la base de datos, Para darle a un usuario las funciones de Editor, Administrador y Administrador, guarde 1 + 2 + 8 = 11

Puede ver por qué funciona esto, si lo ve como una matriz de 1 o 0 valores.

 
|__|__|__|__|__|__| 
    16 8 4 2 1 

Cada función es 1 en la ranura correspondiente. Por lo tanto nuestro caso 11 es:

 
|__|__|_1|_0|_1|_1| 
    16 8 4 2 1 

Si usted tiene una máscara de bits, y desea saber si el usuario tiene un cierto papel, que utilice esta operación:

(máscara de bits & role_value)> = 1

Por ejemplo:

(11 & 8)> = 1? sí, entonces el usuario tiene la función de administrador
(11 & 4)> = 1? no, entonces el usuario no tiene la función de supervisor

Se llama máscara de bits, porque lo que se está haciendo es "verificar si en una posición particular hay un 1", es decir, "aplicar una máscara que enmascara (puesto a 0) todos los lugares, excepto el que está buscando):

 
11 --> |__|__|_1|_0|_1|_1| 
      16 8 4 2 1 
8 --> |__|__|_1|_0|_0|_0| (mask) 
      16 8 4 2 1 
AND -> |__|__|_1|_0|_0|_0| Result: Yes 

espero que ayudó :)

+0

Gracias! Esto es exactamente lo que estaba buscando. ¡Es tan fácil administrar usuarios de esta manera! –

+1

¡Muy buena respuesta! –

3

Creo que ha oído hablar de "bit-flags". No conozco un buen turorial inglés para eso (soy alemán), pero creo que Google te dará algunos buenos enlaces.

+0

Supongo que esto responde a lo que OP estaba buscando. –

+0

Gracias por tu ayuda. Al parecer, estaba preguntando sobre "máscaras de bits", ya que @Palantir tiene descrito. –

Cuestiones relacionadas