web-dev-qa-db-fra.com

Meilleur modèle de base de données de contrôle d'accès basé sur les rôles (RBAC)

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 plugin RBAC lié par Google ne semble pas entretenu (seulement 300 commits vers SVN; le dernier remonte à près d'un an).

Le concept est suffisamment simple à mettre en œuvre à partir de zéro, mais suffisamment complexe et important pour que cela vaille la peine de se concrétiser.

Alors, comment les autres architectent et mettent en œuvre leur modèle RBAC?

41
JasonSmith

À ma connaissance plutôt basique dans ce domaine, les acteurs de base d'un RBAC sont:

  • Ressources.
  • Autorisations.
  • Utilisateurs.
  • Rôles (c'est-à-dire groupes).

Ressources <- nécessite -> ( un ou plusieurs ) Autorisations.

Rôles <- sont des collections de -> ( un ou plusieurs ) Autorisations.

tilisateurs <- peut avoir -> ( un ou plusieurs ) Rôles.

Les tableaux d'un tel modèle seraient:

  • autorisation
  • rôle
  • utilisateur
  • role_permission
  • rôle d'utilisateur

Maintenant, vous souhaiterez peut-être également inclure des ressources ici si vous souhaitez que les utilisateurs de votre application puissent configurer les autorisations dont une ressource a besoin. Mais je n'ai jamais eu besoin de ça. J'espère que cela pourra aider.

62
Amr Mostafa

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

enter image description here

21
Hanxue

Il se trouve que je travaille sur le sous-système RBAC ici au travail en ce moment ... quelle coïncidence.

Mon modèle est basé sur les blocs de construction des différents entités du système qui nécessitent des autorisations, qu'il s'agisse d'attributs à afficher/à mettre à jour ou d'actions à effectuer. Il y a aussi, bien sûr, différents rôles dans le système (qui peuvent être donnés aux utilisateurs), et la colle qui maintient le tout ensemble est le règle d'accès, qui connecte un rôle spécifique, une entité spécifique nécessitant une autorisation et le permission accordé. Une règle d'accès pourrait ressembler à ceci:

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

etc. Je vais laisser l'ERD comme exercice au lecteur ;-) si vous avez des questions, laissez un commentaire.

Yuval = 8-)

3
Yuval

Vous pouvez utiliser Restful ACL Rails plugin .

2
IDBD

Je pense que la réponse à votre question va aussi loin que vous le souhaitez. Si vous pensez à placer des rôles dans des groupes, puis à associer des groupes à des utilisateurs, cela ne suffira pas. Finalement, vous devrez donner des autorisations spécifiques à un utilisateur sur un objet spécifique (un forum, une vidéo, etc.).

Je suis plus proche de la réponse de Yuval, tout ce dont nous avons besoin est d'associer des objets + actions + utilisateurs à l'échelle du projet. Pour fournir cela; un objet de base (Entité) est parfaitement logique. Tout objet héritant d'Entity peut être facilement associé à une action utilisateur + de cette façon.

Comme vous souhaitez également garder les choses simples; ma suggestion serait;

  • Tout objet dû aux restrictions rbac doit dériver d'une entité de base.
  • Il devrait y avoir une liste de rôles, qui sont liés à un à un avec une entité.
  • Il devrait y avoir une liste de relations entre les utilisateurs et les rôles.

Pour aller plus loin, je recommanderais également ce qui suit (pour un rbac automatisé)

  • J'utilise l'accès basé sur les services à mes objets. C'est; Je crée des dépôts d'objets (qui font pour moi le db-access) et j'accède aux dépôts via des fonctions de service.
  • J'utilise un attribut personnalisé au début de chaque fonction de service. Cela définit le rôle requis pour accéder à cette fonction.
  • J'utilise le paramètre User pour accéder à toutes mes fonctions de service, et chaque fonction de service effectue une vérification de rôle avant de s'exécuter. La réflexion m'aide à comprendre quelle fonction j'appelle et quel genre de rôle elle a (via des attributs personnalisés)
  • Je lance également un initialiseur au démarrage de mon application, et il vérifie toutes les fonctions (et leurs attributs) et voit si j'ai ajouté un nouveau rôle requis. S'il y a un rôle que je viens d'ajouter et qui ne semble pas être sur la base de données, il le crée sur la base de données.

Mais hélas, c'est juste disponible pour .NET, pour autant que je sache Java n'a pas d'attributs personnalisés, il est donc peu probable qu'il soit disponible pour Java.

J'aimerais proposer 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 répondre.

1
detay

Exigence de rôle fonctionne très bien avec l'authentification reposante pour fournir des fonctions d'authentification basées sur les rôles et est bien entretenu.

0
Yardboy