Qu'est-ce qu'un modèle de base pour créer une base de données avec des utilisateurs et des groupes?

9

J'essaie de trouver le meilleur moyen pour un système de sécurité de base pour un site Web. Je sais que je veux des utilisateurs et des groupes.

Je pensais que j'aurais:

user_table
user_id
user_name
...

group_type
group_id
group_name
parent_id
...

group_table
id
user_id
group_id

Le premier est l'utilisateur, le second est le groupe et le troisième est la table intermédiaire qui relie les deux. Un utilisateur a plusieurs groupes.

Cela vous semble-t-il correct?

johnny
la source
Autre que les noms. Votre GROUP_TYPEtable doit être nommée GROUPou quelque chose de similaire, et votre GROUP_TABLEréférence à la fois aux utilisateurs et aux groupes, car c'est ce qu'elle relie.
Adam Musch
@adam ne fait-il pas cela avec group_table avec user_id et group_id?
johnny
4
@AdamMusch Il ne doit pas être nommé GROUP, car il s'agit d'un mot réservé. Les tableaux et les colonnes ne doivent jamais être nommés d'après des mots réservés
Philᵀᴹ
1
@Phil a accepté. Vous pouvez aussi bien nommer une table SELECTet un champ FROMafin d'avoir une requête commeSELECT [FROM] FROM [SELECT]
JNK
2
Essayez d'appeler les entités de base quelque chose comme 'app_user' et 'app_role'
ConcernedOfTunbridgeWells

Réponses:

17

La manière traditionnelle de modéliser cela utilise un modèle appelé sécurité basée sur les rôles .

L'idée n'est pas seulement d'avoir des groupes d'utilisateurs, mais aussi des groupes d'autorisations. Voici à quoi ressemble le motif:

ERD de sécurité basée sur les rôles

Notez que vous voulez éviter les mots réservés pour les noms de table, alors ne nommez pas vos tables exactement comme indiqué dans le diagramme.

La façon dont cela fonctionne est que vos groupes ou rôles ont non seulement une liste d'utilisateurs qui leur sont affectés, mais aussi une liste d'autorisations qui leur sont attribuées. Cela vous permet de déterminer à la fois qui peut faire quoi, mais aussi ce qu'il peut faire, si vous me suivez.

Joel Brown
la source
Mais que se passe-t-il si mon utilisateur a un rôle comme gestionnaire ou autre et pour une raison quelconque, le même utilisateur a également besoin d'une autorisation particulière (qui n'est pas dans ce rôle, ni dans aucun autre rôle seul)?
levi
@levi - Si cela se produit, une façon de le gérer consiste à créer un rôle spécial comme "Bob's Special Permissions" , ce qui est un peu compliqué, mais cela résout le problème tant que vous n'avez pas trop d'exceptions comme cette. Il est possible que ce que vous pensez être une exception individuelle soit en fait un nouveau rôle subtil que vous n'avez pas envisagé. Que se passe-t-il lorsque Bob quitte? Le remplaçant de Bob a-t-il également besoin de cette autorisation exceptionnelle? Si c'est le cas, vous avez en fait un rôle avec un membre, pas une exception.
Joel Brown
@levi - Une autre possibilité est que vous avez vraiment besoin d'avoir un mélange de droits individuels et de rôles. Dans ce cas, votre ROLEtable peut être sous-typée en types Individuel et Groupe , où le type de groupe a de zéro à plusieurs membres et le type individuel a exactement un membre. La façon dont vous appliquez ces règles de cardinalité dépend de vous. Cela peut être fait de manière déclarative dans votre schéma de base de données, auquel cas vous devez modifier légèrement le schéma illustré. Ou vous pouvez utiliser la logique d'application, auquel cas votre schéma ressemble toujours à ce que j'ai illustré ci-dessus.
Joel Brown