2011-12-04 18 views
5

OK, solo estoy tratando de mejorar al hacer clases más sueltas, etc. en PHP solo para mejorar mis habilidades. Tengo una base de datos de prueba local en mi computadora y para la tabla de usuarios tengo una columna llamada "función". Intento crear una función que sea una función general para obtener permisos para un usuario, por lo que no depende de una tarea específica que esté intentando hacer.almacenando permisos en una matriz multidimensional php

Cuando un usuario intenta hacer algo como crear un nuevo tema de foro, etc, quiero consultar la base de datos y si "papel" es un valor determinado, permisos de almacén en una matriz multidimensional como la siguiente:

$permissions = array(
    'forums' => array("create", "delete", "edit", "lock"), 
    'users' => array("edit", "lock") 
); 

Luego deseo poder buscar ese conjunto para obtener un permiso específico sin escribir lo siguiente en la parte superior de cada archivo PHP después de que un usuario publique un formulario marcando isset ($ var). Así que si el usuario está tratando de editar un usuario que quiero ser capaz de hacer algo como lo siguiente a través de un método de la clase si es posible

if (Class::get_permissions($userID),array($permissionType=>$permission))) { 
    // do query 
} else { 
    // return error message 
} 

¿Cómo sería una buena manera de tener un permiso de acoplamiento flexible función de comprobación que se ser capaz de hacer algo como esto? No tiene que estar dispuesto exactamente como este, sino que debe estar ligeramente acoplado para poder reutilizarlo y no estar sujeto a una determinada tarea. Pero quiero poder tener una serie de permisos en lugar de simplemente "admin", "usuario", etc. para la reutilización, por lo que no restringe mis opciones en el futuro. Porque tengo un montón de código que es así ahora en la parte superior de mis archivos de script php.

if (Class::get_permissions($userID) == "admin") { 
    // allow query 
} else { 
    // return error 
} 

Gracias por cualquier entrada para ayudar a conseguir esto a donde yo no sigo escribiendo las mismas cosas una y otra vez.

+0

La sección ACL de Zend tiene una introducción ok sobre cómo funciona su acl: http://framework.zend.com/manual/en/zend.acl.introduction.html –

Respuesta

3

Su pregunta es un poco vaga, pero haré mi mejor esfuerzo. Dijiste que estás almacenando sus permisos en una matriz $permissions.

public static $permissions = array(); 

public static function setPermissions($perms) 
{ 
    if (!is_array($perms)) { 
     throw new Exception('$perms must be an array.'); 
    } 
    self::$permissions = $perms; 
} 

public static function hasPermission($section, $action) 
{ 
    if (array_key_exists($section, self::$permissions) 
     && in_array($action, self::$permissions[$section]) 
    ) { 
     return true; 
    } 

    return false; 
} 

Usando esa lógica, cuando se lee permisos de un usuario de la BD, a continuación, establecer el Class::$permissions var estática, así:

Class::setPermissions($permissions); 
// ... 
if (Class::hasPermissions($page, $action)) { 
    // user has permission 
} 

Nota, mi código es bastante genérico y tendrá que permanecer de esa camino hasta que tenga más información. Por ahora, supongo que su arreglo de permisos está usando una sección de página como índice y la matriz es una lista de acciones dentro de esa sección de página a la que el usuario tiene acceso. Por lo tanto, suponiendo que $page se haya establecido en algo como "forums" y el usuario esté intentando realizar una edición (por lo tanto, $action = 'edit'), la función Class::hasPermission() devolverá verdadera.

+0

Gracias por la entrada. Tener una pregunta sin embargo. De esta manera parece que posiblemente deba almacenar la matriz en una variable $ _SESSION []. ¿Es esta la manera en que debería hacerlo? Estoy confundido sobre lo que debería y no debería poner en las variables $ _SESSION. ¡Gracias! – vol4life27

2

Me quedé sin personajes en los comentarios ... Pero esto es para su comentario.

@corey en lugar de tener un objeto estático, incluyo una función que establece mis permisos en la sesión del usuario. Es como parte de mi clase LoginCommand que se llama cuando el usuario inicia sesión, obviamente.

Los permisos se almacenan de la vista a la vista y no tengo que seguir consultando. La verificación de permisos para la mayoría de las cosas solo ocurre cuando el usuario inicia sesión. Sin embargo, ciertas cosas sensibles ejecutaré otra consulta para verificar. Esto tiene la desventaja de que, si los permisos del usuario cambian mientras el usuario tiene una sesión activa, estos cambios no se enviarán al usuario.

Recuerde ejercer una buena seguridad de sesión. PHP Session Security

La única razón por la que no almacenaría datos en el tamaño de su sesión es porque su sesión se hizo demasiado grande. Pero a menos que las sesiones sean megabytes, probablemente no tenga que preocuparse por esto.

+0

siempre que la variable de sesión de cada usuario sea menos de un megabyte, ¿quiere decir? Entonces, si realmente quisiera almacenar alrededor de 6 campos de los datos de los usuarios como nombre, apellido, nombre de usuario, ID de usuario y correo electrónico en una variable $ _SESSION como un objeto Usuario, ¿eso estaría perfectamente bien en lo que se refiere a la escalabilidad? – vol4life27

+0

Sí. Para obtener una aproximación del tamaño de la sesión, use: $ size_of_session_estimate = strlen (serialize ($ _SESSION)); En el momento en que sus sesiones se vuelven demasiado grandes, hay formas de establecer dinámicamente la ruta de guardado de su sesión, etc. Nunca he visto la sesión de alguien demasiado grande, pero nunca he trabajado en Facebook, Amazon, etc. Además, vote mi respuesta. :) – phpmeh

Cuestiones relacionadas