47 votes

Meilleur modèle de base de données RBAC (Role-Based Access Control)

Quel est le meilleur schéma de base de données pour suivre les contrôles d'accès basés sur les rôles pour une application Web?

J'utilise Rails, mais le plug-in RBAC lié par Google n'a pas été maintenu (seulement 300 commits sur SVN; le dernier en date remontait à presque un an).

Le concept est assez simple à mettre en œuvre à partir de rien, pourtant complexe et suffisamment important pour que cela vaille la peine d'être réalisé.

Alors, comment les autres architectes et implémentent-ils leur modèle RBAC?

73voto

Amr Mostafa Points 324

À ma connaissance de base dans ce domaine, les principaux acteurs d'un RBAC sont:

  • Les ressources.
  • Les autorisations.
  • Les utilisateurs.
  • Rôles (Groupes).

Ressources <- besoin -> (un ou plusieurs) des Autorisations.

Les rôles <- sont des collections d' -> (un ou plusieurs) des Autorisations.

Les utilisateurs <- peut-avoir -> (un ou plusieurs) des Rôles.

Les tables pour un tel modèle serait:

  • l'autorisation
  • rôle
  • l'utilisateur
  • role_permission
  • user_role

Maintenant, vous pourriez vouloir inclure des ressources ici si vous souhaitez que les utilisateurs de votre application pour être en mesure de configurer les autorisations d'une ressource de besoin. Mais je n'ai jamais besoin. Espérons que cela aide.

26voto

hanxue Points 924

Voici un schéma simple pour illustrer l'excellente réponse d'Amr Mostafa

entrez la description de l'image ici

3voto

Yuval Points 3350

J'arrive de travailler sur le RBAC sous-système d'ici à l'œuvre, à leur moment... quelle coïncidence.

Mon modèle est basé sur les blocs de construction de différentes entités dans le système qui ont besoin d'autorisations, qu'ils soient des attributs à vue/mis à jour ou les actions à effectuer. Il y a aussi, bien sûr, les différents rôles dans le système (qui peut être donné à tous les utilisateurs), et la colle qui tient le tout ensemble, c'est la règle d'accèsqui relie un rôle spécifique, une autorisation spécifique qui ont besoin de l'entité et de l' autorisation accordée. Une règle d'accès pourraient ressembler à ceux-ci:

rule 14: guest role + page name + read permission
rule 46: approver role + add column + execute permission

et ainsi de suite. Je vais laisser la disquette de réparation d'urgence comme un exercice pour le lecteur ;-) si vous avez des questions, laissez un commentaire.

Yuval =8-)

1voto

IDBD Points 244

Vous pouvez utiliser le plugin Restful ACL Rails .

1voto

detay Points 430

Je pense que la réponse à votre question va aussi profond que vous souhaitez aller. S'il vous arrive de penser à mettre des rôles dans les groupes, puis associer des groupes avec des utilisateurs ne serait pas assez. Finalement, vous aurez besoin de donner des autorisations à un utilisateur sur un objet spécifique (un forum, une vidéo, etc).

Je suis plus proche de Yuval réponse, tous nous avons besoin est d'associer à l'échelle du projet des objets + actions + utilisateurs. Pour fournir cette; un objet de base (l'Entité) a le sens parfait. Tout objet héritant de l'Entité peuvent être facilement associés à un utilisateur + l'action de cette façon.

Comme vous voulez garder les choses simples; ma suggestion serait;

  • N'importe quel objet en raison de rbac restrictions devraient découler d'une Entité de base.
  • Il devrait y avoir une liste de rôles, qui sont des one-to-one relation avec une Entité.
  • Il devrait y avoir une liste de relations entre les utilisateurs et les rôles.

De prendre les choses un peu plus loin, je voudrais aussi vous conseille la suivante (pour un système automatisé de rbac)

  • J'utilise le service d'accès basé à mes objets. Qui est; je repository de créer des objets (qui ne le db-accès pour moi) et je dépôts d'accès via des fonctions de service.
  • Je utiliser un attribut personnalisé au début de chaque fonction de service. Ceci définit le rôle requis pour accéder à cette fonction.
  • J'utilise le paramètre Utilisateur d'accéder à tous mes fonctions de service, et chaque fonction de service ne un rôle vérifier avant d'exécuter lui-même. La réflexion m'aide à comprendre la fonction que j'appelle, et quel genre de rôle qu'elle a (via des attributs personnalisés)
  • J'ai également exécuter un initialiseur sur mon démarrage de l'application, et il vérifie pour toutes les fonctions (et leurs attributs) et voit si j'ai ajouté un nouveau rôle requis. Si il y a un rôle que je viens d'ajouter et ne semble pas être sur la db, il crée sur db.

Mais hélas, c'est juste disponible pour .NET, pour autant que je sais que Java n'a pas d'attributs personnalisés ce qui n'est pas encore susceptibles d'être disponibles pour Java.

Je tiens à venir avec des exemples de code, mais je suis trop paresseux pour le faire. Toujours si vous avez des questions sur ma façon de rbac; vous pouvez demander ici et je vais sûrement la réponse.

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