database - una - tipos de usuarios en sql server
Múltiples tipos de permisos(roles) almacenados en la base de datos como decimal único (2)
Iba a hacer una pregunta aquí acerca de si mi diseño para algunas tablas de base de datos de usuarios / roles era aceptable, pero después de algunas investigaciones encontré esta pregunta:
¿Cuál es la mejor manera de manejar múltiples tipos de permisos?
Suena como un enfoque innovador, por lo que en lugar de una tabla de muchos a muchos usuarios users_to_roles, tengo varios permisos definidos como un único decimal (tipo de datos int I presumo). Eso significa que todos los permisos para un solo usuario están en una fila. Probablemente no tenga sentido hasta que lea la otra pregunta y respuesta
No puedo entender mi cerebro por esto. ¿Alguien puede explicar el proceso de conversión? Suena "bien", pero simplemente no entiendo cómo convierto los roles a un decimal antes de que aparezca en el archivo db, y cómo se convierte de nuevo cuando sale del archivo db. Estoy usando Java, pero si lo apagaste, eso también sería genial.
Aquí está la respuesta original en caso de que la otra pregunta se elimine:
"Personalmente, a veces uso una enumeración de permisos marcada. De esta forma puede usar las operaciones AND, OR, NOT y XOR bit a bit en los elementos de la enumeración.
[Flags]
public enum Permission
{
VIEWUSERS = 1, // 2^0 // 0000 0001
EDITUSERS = 2, // 2^1 // 0000 0010
VIEWPRODUCTS = 4, // 2^2 // 0000 0100
EDITPRODUCTS = 8, // 2^3 // 0000 1000
VIEWCLIENTS = 16, // 2^4 // 0001 0000
EDITCLIENTS = 32, // 2^5 // 0010 0000
DELETECLIENTS = 64, // 2^6 // 0100 0000
}
Luego, puede combinar varios permisos usando el operador AND bit a bit.
Por ejemplo, si un usuario puede ver y editar usuarios, el resultado binario de la operación es 0000 0011, que se convierte a decimal es 3. A continuación, puede almacenar el permiso de un usuario en una sola columna de su Base de datos (en nuestro caso, sería ser 3).
Dentro de su aplicación, solo necesita otra operación bit a bit (O) para verificar si un usuario tiene un permiso particular o no ".
En realidad, así es como determinamos la autoridad dentro de una aplicación web bastante grande para la que soy DBA.
Si va a hacer algo como esto, realmente se beneficiará de tener una tabla de números . Hará tus cálculos mucho más rápido.
La configuración básica incluye las siguientes tablas:
- Grupos: para hacer muchos a muchos usuarios y puntos de seguridad
- Puntos de seguridad: que contienen un valor para la autorización anónima y uno para usuarios autenticados que no forman parte de un grupo separado
- Tabla de unión de punto de seguridad de grupo
- Una tabla especial de números BitMask que contiene entradas para los valores ^ 2. Por lo tanto, hay una entrada para 2 (2) y dos entradas para tres (2 y 1). Esto nos evita tener que calcular valores cada vez.
Primero determinamos si el usuario está conectado. Si no lo son, devolvemos la autorización anónima para el punto de seguridad.
A continuación determinamos si el usuario es miembro de cualquier grupo asociado con el punto de seguridad a través de un EXISTS
simple que utiliza un JOIN
. Si no lo son, devolvemos el valor asociado con el usuario autenticado. La mayoría de los valores predeterminados anónimos y autenticados están configurados en 1 en nuestro sistema porque le solicitamos que pertenezca a grupos específicos.
Nota: si un usuario anónimo obtiene un acceso nulo, la interfaz los arroja a un cuadro de inicio de sesión para permitirles iniciar sesión y volver a intentarlo.
Si el usuario es miembro de uno o más grupos, entonces seleccionamos valores distintos de la tabla BitMask para cada uno de los valores definidos para los grupos. Por ejemplo, si pertenecía a tres grupos y tenía un nivel de autorización de 8, uno con 12 y el último con 36, nuestra selección contra la tabla Máscara de bit devolvería 8, 8 y 4, y 4 y 32, respectivamente. Al hacer una distinción obtenemos el número 4, 8 y 32 que mordían correctamente las máscaras a 101100.
Ese valor se devuelve como el nivel de autorización de los usuarios y procesado por el sitio web.
¿Tener sentido?
Usas operaciones bit a bit. El pseudo-código sería algo así como:
bool HasPermission(User user, Permission permission) {
return (user.Permission & permission) != 0;
}
void SetPermission(User user, Permission permission) {
user.Permission |= permission;
}
void ClearPermission(User user, Permission permission) {
user.Permission &= ~permission;
}
El permiso es el tipo de enumeración definido en su publicación, aunque el tipo que sea debe basarse en un tipo de tipo entero. Lo mismo se aplica al campo User.Permission.
Si esos operadores (&, | =, y & =) no tienen sentido para usted, entonces lea en operaciones bit a bit (a nivel de bit AND y de bit a bit OR).