2011-01-11 2 views
5

Je crée un système de CMS de photographie personnalisé et j'ai besoin de mettre en place un système d'authentification et d'autorisation d'utilisateur. Quelles sont les pratiques habituelles dans l'industrie pour créer un tel schéma?Comment structurer les permissions d'utilisateur pour un cms

Fondamentalement, je dois avoir des utilisateurs, et les utilisateurs peuvent être de type différent. Certains utilisateurs permettent de dire que seules les galeries peuvent être créées, d'autres ne peuvent que les éditer, ou seulement certaines galeries, etc. Alors, comment cela devrait-il être structuré? J'utilise la base de données MySQL et j'utilise PHP pour coder le CMS.

J'ai essayé de regarder sur Google, mais seulement trouvé des articles qui expliquent comment créer des utilisateurs pour la base de données MySQL réelle. J'apprécierai un lien vers un article qui explique comment ce genre de choses devrait être fait.

Merci d'avance.

+0

Regardez dans PEAR Live_User. C'est un peu vieux et n'est jamais devenu un standard, mais il gère la plupart des microgestion des permissions. – mario

Répondre

5

Il existe deux approches communes à ce problème, les deux impliquent de séparer les opérations autorisées en quelque chose de discret que vous pouvez nommer. (Supprimer les messages, créer des galeries, mettre à jour le code, vider la base de données, lancer les missiles, ouvrir la porte du garage.) Donnez à chacun un bitmap dans un bitvector (si vous avez moins de 32 autorisations, et le mécanisme de stockage compact, si vous pensez qu'il dépassera 32 autorisations, la taille d'un entier typique, alors peut-être une table dans votre base de données ..)

Ainsi, vous pouvez mapper les utilisateurs directement aux autorisations ("I Vous pouvez attribuer gallery_create à sarnold ") ou vous pouvez mapper les utilisateurs et les autorisations via les classes d'utilisateurs (" Je souhaite attribuer gallery_create à tous les membres de la classe art_curator, puis je souhaite promouvoir l'utilisateur sarnold de docent à art_curator ").

Si vous mappez les utilisateurs directement sur les autorisations, vous risquez de trouver un hodge-podge d'autorisations étranges dans le déploiement des années plus tard. Si vous mappez des utilisateurs à des classes, vous pouvez vous retrouver avec des classes artificielles d'utilisateurs, car vous avez fait confiance à une personne spécifique avec un privilège, mais pas d'autres privilèges. Déterminer la meilleure façon d'aborder cette cartographie est toujours un problème ouvert; J'ai écrit sur différents types de modèles d'autorisation Modelling a permissions system qui peuvent être trop ou trop peu d'informations, en fonction de la complexité de votre système.

Si vous souhaitez seulement des autorisations de magasin dans bitmaps (par exemple, la mise en œuvre du noyau Linux de CAPABLE() pour CAP_SYS_ADMIN, CAP_DAC_OVERRIDE, et ainsi de suite), alors vous pouvez ajouter de nouveaux privilèges avec quelque chose de très simple:

if (requested_new_permission == "CAP_SYS_ADMIN") 
    user->permissions |= CAP_SYS_ADMIN; 
else if (requested_new_permissions == "CAP_DAC_OVERRIDE") 
    user->permissions |= CAP_DAC_OVERRIDE; 

...

Ensuite, lorsque vous avez besoin de tester les capacités:

if (CAPABLE(user, CAP_SYS_ADMIN)) 
    reboot_server(); 

et la macro CAPABLE() peut ressembler à:

#define CAPABLE (utilisateur, cap) ((utilisateur) -> autorisations & (cap))

(Pardonnez-C, je ne sais pas php très bien; J'ai été forcé de corriger beaucoup trop de bugs php pour vouloir l'apprendre moi-même.)

Si vous voulez mapper les utilisateurs aux autorisations par classes d'utilisateurs, il est peut-être trois tables: une table users, une table groups ou classes, et une table permissions. classes a des colonnes pour user_id et permission_id. Lorsque vous devez vérifier si une autorisation peut être accordée, sélectionnez la classe de l'utilisateur, puis sélectionnez l'autorisation dans la classe. (Cela fait aussi des années que j'ai écrit SQL à la main, je suis sûr qu'une seule requête peut vous donner une réponse par oui ou par non, mais je ne suis pas sûr que ce serait une jointure de plusieurs tables ou des sous-requêtes. serait juste plus facile de faire deux requêtes à la base de données. :)

Espérons que cela aide.

Questions connexes