2010-09-09 23 views
8

Diseñando un sitio bastante complicado con una gran cantidad de ajax ejecutándose en una sola página. Llegué al punto en el que algunos usuarios deben tener permiso específico para hacer cosas y algunos deben ser detenidos de la acción. He configurado funciones de usuario en mi base de datos y todo está funcionando bien, pero me pregunto si existe un método más fácil/seguro para almacenar cada permiso.¿La mejor manera de almacenar permisos de usuario?

Actualmente, cuando un usuario inicia sesión, sus permisos específicos se toman de la base de datos y se cargan en una matriz de sesión. Para verificar si el usuario tiene permiso, simplemente verifico si el permiso está contenido en la matriz. Esto parece lento, y casi como si me falta una solución mejor.

Además, las sesiones aparentemente pueden ser editadas por el usuario ... ¿hay un método más seguro?

He pensado en ejecutar una consulta para cada comprobación, pero eso podría aumentar en gran medida el tiempo de carga para una simple solicitud de ajax.

Estoy abierto a todas y cada una de las ideas. Gracias.

Respuesta

20

Lo primero y más importante, el usuario no puede editar las variables de Sesión. Lo único que se guarda en la máquina del usuario es una ID de sesión. Ese ID luego es utilizado por el servidor para capturar pares clave/valor que se almacenan SOLAMENTE en el servidor. Desde el punto de vista del cliente, es imposible cambiar los valores por capricho.

En segundo lugar, no me preocuparía demasiado en una conexión de base de datos. Evita repetirlo, pero no te preocupes demasiado por la primera conexión.

Finalmente, mi forma favorita de hacer múltiples permisos sin crear roles es usar matemática binaria. Algunas personas les gusta esto, otras no, pero me parece útil.

Para utilizar este método, las imágenes que se definen los siguientes valores:

CAN_EDIT_SOMETHING  = 1  // Powers of 2 
CAN_SEE_SOMETHING_ELSE = 2 
CAN_DO_ADMIN_STUFF  = 4 
...      = 8 

dar a la gente varios permisos, utilizamos binaria O

PERMISSIONS = CAN_EDIT_SOMETHING | CAN_DO_ADMIN_STUFF 

Para ilustrar cómo funciona esto, podemos ver los bits:

0b0001 
OR 0b0100 
--------- 
    0b0101 

Para verificar si alguien tiene permiso, utilice el código binario AND

if(PERMISSIONS & CAN_EDIT_SOMETHING != 0) { 
} 

Para ver cómo funciona esto, nos fijamos en los bits de nuevo

0b0101 
AND 0b0001 
---------- 
    0b0001 // Not equal to 0. They must have that permission! 

El beneficio final de este método es que permite combinar varios permisos fácilmente en "meta-permisos"

// If both EDIT_SOMETHING and ADMIN_STUFF are tasks that an admin 
// can perform, we can combine them easily 
// 
IS_FULL_ADMIN  = CAN_EDIT_SOMETHING | CAN_DO_ADMIN_STUFF 


// We can then use this value exactly as we do any other permission 
// 
PERMISSIONS  = IS_FULL_ADMIN | CAN_SEE_SOMETHING ELSE 

Úselo si lo desea, pero es un buen truco para tener en su arsenal.

+0

Gracias por explicar el binario, quería ir con algo así cuando primero diseñaba roles. Terminé yendo con 2 tablas db que contienen roles de usuario y permisos indv, lo que tiene más sentido para mí. También podría jurar que vi en algún lugar que era posible extraer sus datos de sesión y editarlos, aunque es difícil. Tal vez no. –

+0

@Capt Otis, como dije, funciona en algunos escenarios, y no en otros. Conoces tu sistema mejor que yo. En cuanto a las sesiones, así es como funciona en PHP, pero debe verificar el sistema que está utilizando. Use Fiddler o Wireshark para examinar el tráfico y ver qué es lo que realmente está viendo su usuario. Si todo lo que se pasa de ida y vuelta es una identificación (que no cambia cuando los valores cambian), entonces estás bien.Si observa más valores que una ID o si nota que la información de la sesión cambia cuando cambian los valores de la sesión, entonces tiene problemas y es mejor que mire de cerca sus sesiones :) – riwalk

1

¡Me parece bien! Puede consultar algún software para mejorar el rendimiento de su chache de sesión.

¡Consultar el DB cada vez no es tan malo como parece! En primer lugar, es probable que deba conectarse a la base de datos, en segundo lugar si consultó los permisos de los usuarios cuando iniciaron sesión, es probable que todas las filas relevantes estén almacenadas en el búfer y no se requiera IO, en tercer lugar, una consulta para un solo permiso para un solo usuario va a ser mucho más ligero que una consulta para todos los permisos para un usuario.

-2

Su explicación del modelo parece un poco confusa. El permiso es el producto de la autorización del sujeto y la autorización del objeto. ¿Realmente almacena estos productos para cada combinación de sujeto y objeto? Es una solución muy ineficiente y muy difícil de administrar.

Además, al parecer, las sesiones pueden ser editados por el usuario

WTF ????? !!!!

Los datos de sesión solo deben modificarse con los métodos que defina en el código; si los usuarios pueden modificar cualquier parte de los datos de la sesión de la forma que prefieran, este es el primer problema que debe abordar, hasta que Si lo hace, será virtualmente imposible confiar en cualquier parte de su método de autenticación/autorización a menos que mueva la autenticación completamente fuera del dominio de su código de aplicación (por cierto: esta no es la manera correcta de solucionar el problema).

Ciertamente, buscar en una matriz muy grande (no estoy seguro del punto de ruptura real, pero en la región de n = 1000, pero hay muchas variables que afectan esto) puede ser significativamente más lento que obtener los resultados de una base de datos.

Es difícil decir lo que está haciendo mal sin entender cómo funciona su sistema actual. ¿Es one of these?

+0

2 votos a favor y no votos? – symcbean

Cuestiones relacionadas