Quelle est la meilleure façon de gérer plusieurs types d'autorisation?

voix
17

Je rencontre souvent le scénario suivant où je dois offrir différents types d'autorisations. Je l'utilise principalement ASP.NET / VB.NET avec SQL Server 2000.

Scénario

Je veux offrir un système d'autorisation dynamique qui peut fonctionner sur différents paramètres. Disons que je veux donner un département ou juste une personne l'accès à une application spécifique. Et prétendre que nous avons un certain nombre d'applications qui ne cesse de croître.

Dans le passé, j'ai choisi l'une des deux façons suivantes que je sais faire.

1) Utiliser une seule table d'autorisation avec des colonnes spéciales qui sont utilisées pour déterminer une façon d'appliquer les paramètres. Les colonnes spéciales dans cet exemple sont TypeID et TypeAuxID. Le SQL ressemblerait à quelque chose comme ça.

SELECT COUNT(PermissionID)
FROM application_permissions
WHERE
(TypeID = 1 AND TypeAuxID = @UserID) OR
(TypeID = 2 AND TypeAuxID = @DepartmentID)
AND ApplicationID = 1

2) utiliser une table de correspondance pour chaque type de permission, alors les joindre ensemble.

SELECT COUNT(perm.PermissionID)
FROM application_permissions perm
LEFT JOIN application_UserPermissions emp
ON perm.ApplicationID = emp.ApplicationID
LEFT JOIN application_DepartmentPermissions dept
ON perm.ApplicationID = dept.ApplicationID
WHERE q.SectionID=@SectionID
  AND (emp.UserID=@UserID OR dept.DeptID=@DeptID OR
 (emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1
ORDER BY q.QID ASC

Mes pensées

Je souhaite que les exemples de sens. Je les ai bricolé.

Le premier exemple nécessite moins de travail, mais aucun d'entre eux se sentent comme la meilleure réponse. Y at-il une meilleure façon de gérer cette situation?

Créé 04/08/2008 à 18:46
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
10

Je suis d'accord avec John Downey.

Personnellement, je l'utilise parfois une énumération des autorisations signalé. De cette façon, vous pouvez utiliser AND, OR, NOT et XOR opérations sur les éléments binaires de l'énumération.

"[Flags]
public enum Permission
{
    VIEWUSERS = 1, // 2^0 // 0000 0001
    EDITUSERS = 2, // 2^1 // 0000 0010
    VIEWPRODUCTS = 4, // 2^2 // 0000 0100
    EDITPRODUCTS = 8, // 2^3 // 0000 1000
    VIEWCLIENTS = 16, // 2^4 // 0001 0000
    EDITCLIENTS = 32, // 2^5 // 0010 0000
    DELETECLIENTS = 64, // 2^6 // 0100 0000
}"

Ensuite, vous pouvez combiner plusieurs autorisations à l' aide de l'opérateur AND niveau du bit.

Par exemple, si un utilisateur peut visualiser et éditer les utilisateurs, le résultat binaire de l'opération est 0000 0011 qui est converti en décimal 3.
Vous pouvez ensuite stocker l'autorisation d'un utilisateur dans une seule colonne de votre DataBase (dans notre cas , il soit 3).

, Vous avez juste besoin dans votre application une autre opération de bits (OR) pour vérifier si un utilisateur a une autorisation particulière ou non.

Créé 04/08/2008 à 19:23
source utilisateur

voix
10

La façon dont je vais généralement sur le codage des systèmes d'autorisation est d'avoir 6 tables.

  • Les utilisateurs - c'est à peu vers l'avant est directement votre table d'utilisateurs typique
  • Groupes - ce serait synonyme de vos départements
  • Rôles - ceci est une table avec toutes les autorisations généralement aussi, y compris un nom lisible par l'homme et une description
  • Users_have_Groups - c'est un nombre à plusieurs table des quels groupes un utilisateur appartient à
  • Users_have_Roles - un grand nombre à plusieurs table quels rôles sont attribués à un utilisateur individuel
  • Groups_have_Roles - la finale many-to-many table des rôles que chaque groupe a

Au début d'une session d'utilisateurs que vous exécutez une logique qui sort tous les rôles qu'ils ont attribué, que ce soit le répertoire ou par un groupe. Ensuite, vous codez contre ces rôles que vos autorisations de sécurité.

Comme je l'ai dit ce que je fais habituellement, mais votre millage peut varier.

Créé 04/08/2008 à 18:56
source utilisateur

voix
2

Honnêtement le ASP.NET membres / rôles fonctionnalités fonctionnerait parfaitement pour le scénario que vous avez décrit. Écrire vos propres tables / procs / classes est un excellent exercice et vous pouvez obtenir le contrôle très belle vue sur les détails minute, mais après avoir fait moi-même je l'ai conclu qu'il est préférable d'utiliser simplement la construction dans des choses .NET. Beaucoup de code existant est conçu pour fonctionner autour d'elle qui est agréable à bien. Écrit à partir de zéro m'a pris environ 2 semaines et il était loin d'être aussi robuste que .NETs. Vous devez coder tellement la merde (récupération de mot de passe, verrouillage automatique, le chiffrement, les rôles, une interface d'autorisation, des tonnes de procs, etc.) et le temps pourrait être mieux dépensé ailleurs.

Désolé si je ne répondais pas à votre question, je suis comme le gars qui dit apprendre c # quand quelqu'un pose une question vb.

Créé 07/08/2008 à 03:23
source utilisateur

voix
2

En plus de John Downey et les solutions de jdecuyper, j'ai aussi ajouté un « refus explicite » bit à la fin / début du bitfield, de sorte que vous pouvez effectuer des autorisations d'additifs par groupe, appartenance à un rôle, puis soustraire les autorisations basées sur refus explicite entrées, un peu comme NTFS fonctionne, l'autorisation sage.

Créé 04/08/2008 à 19:39
source utilisateur

voix
0

Une approche que je l'ai utilisé dans diverses applications est d'avoir une classe générique PermissionToken qui possède une propriété de valeur variable. Ensuite, vous interrogez l'application demandée, il vous indique quels PermissionTokens sont nécessaires pour l'utiliser.

Par exemple, l'application de livraison peut vous dire qu'il a besoin:

new PermissionToken()
{
    Target = PermissionTokenTarget.Application,
    Action = PermissionTokenAction.View,
    Value = "ShippingApp"
};

Cela peut évidemment être étendu pour créer, modifier, supprimer, etc et, en raison de la propriété personnalisée de la valeur, toute application, module ou widget peut définir ses propres autorisations requises. YMMV, mais cela a toujours été une méthode efficace pour moi que j'ai trouvé bien à l'échelle.

Créé 04/08/2008 à 19:03
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more