Comment concevoir un hiérarchiques basées sur le rôle de système de contrôle d'accès

Accord de base est que nous avons une coutume construit "kickstart" pour nos projets. Pour cela, nous sommes à la recherche à refaire le contrôle de l'utilisateur. Je sais qu'il y a beaucoup de questions sur le général rbac, mais je ne trouve aucune sur hiérarchique rbac?

Nos exigences sont les suivantes:

  • Rôles peuvent être attribués à des autorisations de groupe
  • Si le rôle ne dispose pas d'une autorisation d'entrée, puis il est automatiquement refusé
  • Un utilisateur peut être donnée primordiale autorisations
  • Un utilisateurs primordial des autorisations est soit d'accorder ou de refuser
  • Si un utilisateur est expressément refusé une permission n'importe quels rôles dire "accordé" le remplacement des victoires.
  • Les utilisateurs peuvent avoir plusieurs rôles
  • Rôles peut avoir de hiérarchie
  • Rôles ne peut hériter que d'autres rôles (par exemple, Un "Forum Super Modérateur" rôle "Modérateur du Forum", et un "Système de Responsable", et le "Modérateur du Forum" rôle déjà hérite de la "Utilisateur du Forum" rôle )
  • Rôles qui héritent d'un autre rôle que de refuser ou d'accorder un privilège de remplacer leur enfant la permission
  • Autorisations sont regroupés par "module" (par exemple, un "Blog" module peut avoir une "modifier l'entrée" de l'autorisation, et un "Forum" module peut avoir une "modifier l'entrée" permission et ils seront pas en conflit)
  • Il y a un "Tout et Rien" autorisation qu'il accorde automatiquement un accès complet

Donc, avec les exigences de la route, voici comment je pense à le faire.

Tableau: Les Utilisateurs

id            | int     | unique id

Table: Rôles

id            | int     | unique id
-------------- | ---------------------------------------------
title         | varchar | human readable name

Table: Autorisations

id            | int     | unique id
-------------- | ---------------------------------------------
module        | varchar | module name
-------------- | ---------------------------------------------
title         | varchar | human readable name
-------------- | ---------------------------------------------
key           | varchar | key name used in functions

Table: Role_User

role_id       | int     | id from roles table
-------------- | ---------------------------------------------
user_id       | int     | id from users table

Table: Permission_Role

id            | int     | unique id
-------------- | ---------------------------------------------
permission_id | int     | id from permissions table
-------------- | ---------------------------------------------
role_id       | int     | id from roles table
-------------- | ---------------------------------------------
grant         | tinyint | 0 = deny, 1 = grant

Table: Permission_User

id            | int     | unique id
-------------- | ---------------------------------------------
permission_id | int     | id from permissions table
-------------- | ---------------------------------------------
user_id       | int     | id from users table
-------------- | ---------------------------------------------
grant         | tinyint | 0 = deny, 1 = grant

Bien, en fait, c'est la moitié, la partie je suis sûr de la partie, je suis coincé sur est la hiérarchie des rôles.

Alors, comment puis-je concevoir ce?
Mon idée est que, pour économiser sur les requêtes de base de données, je vais me contenter de construire l'autorisation de la matrice de connexion, et l'enregistrer à la séance pour que les requêtes n'ont pas à être aussi simples qu'elles le sont uniquement exécuté une fois pour chaque connexion.

Le problème que je vois est que, je vais avoir besoin de savoir la hiérarchie des rôles afin que je puisse résoudre le héritée des rôles des autorisations avant de me résoudre la hériter.

Les autorisations de l'utilisateur est la partie la plus facile, la par-les autorisations de l'utilisateur sont essentiellement les enfin résolu groupe.

  • Est-il une raison pourquoi user ont pas role, mais ont permission? C'est un "permisson modèle", pas de "modèle", n'est-ce pas? Avec cette approche, les rôles ne sont pas utilisées n'importe où.
  • Oups, j'ai Oublié d'ajouter que la table, édité!
  • Pourtant, je pense que il n'y a aucune raison pour user avoir permission. Il pourrait avoir roles avec permissions, mais pas permissions comme ils sont. Cette chose ruiner la logique (à mon humble avis).
  • Un utilisateur lui-même peut également être donné les autorisations, ces autorisations de remplacer tous les rôles, ils sont. Il évite d'avoir à créer de nouveaux rôles avec une autorisation simplement parce que vous voulez que l'Utilisateur X pour être capable de faire une action supplémentaire. Ou si l'utilisateur a été de faire quelque chose qu'ils ne devraient pas, vous pouvez rapidement le nier pour cet utilisateur. Sinon, vous devrait hériter le niveau le plus élevé de rôle puis nier qu'il qui peut être gênant.
  • C'est un peu comme dire que chaque utilisateur est son propre rôle qui hérite automatiquement de tous les autres rôle de l'utilisateur a été donné sans avoir à créer un groupe pour l'utilisateur. Cela fait-il sens?
  • Oui. Cela a du sens.

InformationsquelleAutor Hailwood | 2013-04-22