2011-05-14 15 views
42

Estoy creando un sitio web en el que hay proyectos, usuarios y permisos para cada usuario o grupo de usuarios. Lo que esto es es una herramienta de colaboración de la comunidad, y tengo 4 permisos diferentes:Implementación de permisos basados ​​en la reputación

  • Creator - hacer cambios, aceptar cambios, cambiar permisos
  • aceptar cambios
  • Hacer cambia
  • Ver

¿Cómo podría implementar, en una base de datos, este tipo de sistema de permisos para grupos de usuarios?

Editar: Los grupos/permisos se definen por su reputación, como en StackOverflow.

Edición 2: más en detalle: cada archivo debe tener un permiso, los proyectos necesitan permisos predeterminados para los archivos recién creados, y también tengo que configurar los permisos de la base de datos MySQL.

+2

¿Tienes que usar php? Sé que Django tiene una gran ayuda para el permiso de la caja. Supongo que cualquier framework de MVC (o similar) dado, probablemente también le proporcione permisos similares. Django también es realmente fácil de aprender y aprender. – wilbbe01

+0

@ wilbee01 Si está desarrollando sitios web, entonces Django no funcionaría, ya que es Python y necesita PHP o ASP.net para el desarrollo web. – Flipper

+0

No, no puedo, desafortunadamente :( – Ryan

Respuesta

58
user_table 
id, etc 

permission table 
id, user_id, permission_type 

con esta estructura, cada usuario puede tener varios tipos de permisos asociados con su cuenta, una para cada conjunto de características que podría tener acceso a. nunca necesitaría cambiar la estructura de la tabla para agregar nuevos tipos de permisos.

Para llevar esto un paso más allá, puede hacer que cada tipo de permiso sea un número binario. De esta forma, podría hacer que un conjunto de permisos se representara mediante un entero utilizando operadores bit a bit.

por ejemplo, si usted tenía las constantes

PERMISSION_CHANGE_PERMISSIONS = bindec('001') = 1 
PERMISSION_MAKE_CHANGES = bindec('010') = 2 
PERMISSION_ACCEPT_CHANGES = bindec('100') = 4 

Se puede combinar estos valores en un entero usando un operador de bits "|"

(PERMISSION_CHANGE_PERMISSIONS | PERMISSION_MAKE_CHANGES) = bindec('011') = 3 = $users_combined_permissions 

a continuación para comprobar si tienen un permiso específico, utilice el operador de bits "&"

($users_combined_permissions & PERMISSION_MAKE_CHANGES) = true 

si lo hizo, sólo se necesitaría un registro db para cada conjunto de permisos.

+0

Esa es una forma interesante de hacerlo, pero creo que ese método solo sería adecuado para un sistema que tendría que ser complejo y tener muchos permisos diferentes. – Flipper

+12

@Flipper, supongo. Sin embargo, nunca está de más pensar en el futuro. Hacer que su código sea ágil puede ahorrarle mucho tiempo y dolor de cabeza en una fecha posterior. – dqhendricks

+0

Este va a ser un sistema bastante complejo con el tiempo, por lo que podría ser útil, ¡gracias! – Ryan

0

Crearía dos tablas; usuarios y rangos

User 
----- 
id 
username 
rankID 


Ranks 
------ 
id 
makeChanges 
acceptChanges 
changePermissions 
view 

A continuación, sólo crean las diversas filas que desee en la tabla Rangos y establezca el rankID de los usuarios para que coincida con el correspondiente que desea. Asegúrese de establecer en la tabla de Rangos cada campo a un valor de 0 o 1; con 0 no teniendo esa habilidad y 1 teniendo esa opción.

Editar Si fuera a hacer esto sin una base de datos, podría hacerlo con las clases o instancias en PHP5. Por ejemplo, digamos que usted había establecido un nombre para cada una de las cosas que tenía en su puesto original:

Creator - make changes, accept changes, change permissions 
Reviewer - Accept changes 
Editor - Make changes 
Regular - View 

entonces se podría hacer algo, como a continuación. (La forma de base de datos, obviamente, sería una manera mucho mejor, pero esto es sólo un ejemplo.)

class Regular 
{ 
    public function View() 
    { 
     //Do the view stuff in here 
    } 
} 

class Editor extends Regular implements Edit 
{ 

} 

class Reviewer extends Regular implements Review 
{ 

} 

interface Review 
{ 
    public function AcceptChanges() 
    { 
     //Do the accept changes here 
    } 
} 

interface Edit 
{ 
    public function MakeChanges() 
    { 
     //Do the make changes stuff here 
    } 
} 


class Creator extends Regular implements Edit, Review 
{ 
    public function ChangePermissions() 
    { 
     //Do the change permissions stuff here 
    } 
} 
+0

El problema que tengo, sin embargo, son los grupos de usuarios (moderadores, de confianza, etc., como en Stack Overflow). – Ryan

+0

@minitech ¿Qué quiere decir? Haría un rango llamado Moderadores y luego establecería el ID de rango de todos en ese rango específico. Luego haga una consulta SQL para obtener todo de los usuarios de ese grupo. – Flipper

+1

@Flipper pensando en el futuro, tendría que agregar una nueva columna de base de datos cada vez que se necesita un nuevo tipo de permiso. – dqhendricks

3

He usado Zend_Acl en el pasado para esto. Lo puedo recomendar Una biblioteca probada y probada que es bastante fácil de implementar y se puede usar de manera independiente. Esta opción se ampliará bien si tiene diferentes esquemas de permisos para agregar después.

Cuestiones relacionadas