44 votes

Implémentation des autorisations en fonction de la réputation

Je suis de la création d'un site web dans lequel il y a des projets, des utilisateurs et des autorisations pour chaque utilisateur ou groupes d'utilisateurs. Ce que ce est est une communauté de l'outil de collaboration, et j'ai 4 différentes autorisations:

  • Créateur - apporter des modifications, d'accepter les changements, de modifier les autorisations
  • Accepter les modifications
  • Apporter des modifications
  • Vue

Comment pourrais-je mettre en œuvre, dans une base de données, ce type de système d'autorisation, pour des groupes d'utilisateurs?

Edit: les Groupes et les autorisations sont définies par la réputation, comme sur StackOverflow.

Edit 2 - plus dans le détail: Chaque fichier doit avoir une autorisation, les projets doivent autorisations par défaut pour les fichiers nouvellement créés, et j'ai aussi besoin de configurer MySQL autorisations de base de données.

59voto

dqhendricks Points 11630
user_table
id, etc

permission table
id, user_id, permission_type

avec cette structure, chaque utilisateur peut avoir plusieurs types d'autorisations associées à leur compte, un pour chaque ensemble de fonctionnalités dont ils pourraient avoir accès. vous n'aurez jamais besoin de changer la structure de la table afin d'ajouter de nouveaux types d'autorisations.

pour aller plus loin, vous pourriez faire de chaque type d'autorisation d'un nombre binaire. de cette façon, vous pourriez faire un ensemble d'autorisations d'être représenté par un entier en utilisant les opérateurs au niveau du bit.

par exemple, si vous avez eu l'constantes

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

vous pouvez combiner ces valeurs en un nombre entier à l'aide d'un bit à bit de l'opérateur "|"

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

ensuite, pour vérifier s'ils ont une autorisation spécifique, utilisez l'opérateur bit à bit "&"

($users_combined_permissions & PERMISSION_MAKE_CHANGES) = true

si vous l'avez fait, vous n'aurez besoin que d'un db d'enregistrement pour chaque ensemble d'autorisations.

3voto

stefgosselin Points 5880

J'ai utilisé Zend_Acl dans le passé pour cela. Je peux le recommander. Une bibliothèque éprouvée et assez facile à mettre en œuvre et qui peut être utilisée de manière autonome. Cette option évoluera bien si vous avez différents régimes d'autorisation à ajouter par la suite.

0voto

Flipper Points 1600

Je voudrais créer deux tables; les utilisateurs et les rangs.

User
-----
id
username
rankID


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

Puis il suffit de créer les différents grades que vous voulez dans les Rangs de la table et de définir la rankID des utilisateurs afin de correspondre à l'un correspondant que vous souhaitez. Assurez-vous de mettre dans les Rangs de la table de chaque champ à une valeur de 0 ou 1; 0 étant de ne pas avoir cette capacité et 1 avoir cette option.

Modifier Si vous étiez sur le point de le faire sans une base de données, alors vous pourriez donner à faire avec les classes ou même parfois en PHP5. Par exemple, disons que vous aviez mis un nom pour chacune des choses que vous aviez dans votre message d'origine:

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

Ensuite, vous pourriez faire quelque chose comme ci-dessous. (La base de données de façon serait évidemment une bien meilleure façon, mais c'est juste un exemple.)

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
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X