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

Je rencontre souvent le scénario suivant dans lequel je dois proposer différents types d'autorisations. J'utilise principalement ASP.NET / VB.NET avec SQL Server 2000.

Scénario

Je veux proposer un système d'autorisation dynamique qui peut fonctionner sur différents paramètres. Supposons que je souhaite donner à un service ou à une personne en particulier l'accès à une application. Et prétendre que nous avons un nombre d'applications qui ne cesse de croître.

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

  1. Utilisez une seule table d'autorisations avec des colonnes spéciales utilisées pour déterminer comment 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. Utilisez une table de mappage pour chaque type d'autorisation, puis joignez-les tous 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

J'espère que les exemples ont du sens. Je les ai bricolés.

Le premier exemple nécessite moins de travail, mais aucun des deux ne semble être la meilleure réponse. Existe-t-il une meilleure façon de gérer cela ?

请先 登录 后评论

2 réponses

John Downey

La façon dont je procède généralement pour coder les systèmes d'autorisation est d'avoir 6 tables.

  • Utilisateurs - c'est assez simple, c'est votre tableau d'utilisateurs typique
  • Groupes : ce serait synonyme de vos services
  • Rôles : il s'agit d'un tableau avec toutes les autorisations, y compris généralement un nom lisible par l'homme et une description
  • Users_have_Groups - il s'agit d'un tableau plusieurs-à-plusieurs des groupes auxquels appartient un utilisateur
  • Users_have_Roles : un autre tableau plusieurs-à-plusieurs des rôles attribués à un utilisateur individuel
  • Groups_have_Roles : le tableau final plusieurs-à-plusieurs des rôles de chaque groupe

Au début d'une session d'utilisateurs, vous exécutez une logique qui extrait tous les rôles qu'ils ont attribués, soit par répertoire, soit par l'intermédiaire d'un groupe. Ensuite, vous codez en fonction de ces rôles en tant que vos autorisations de sécurité.

Comme je l'ai dit, c'est ce que je fais habituellement, mais votre kilométrage peut varier.

请先 登录 后评论
Shawn

Honnêtement, les fonctionnalités d'adhésion/de rôles ASP.NET fonctionneraient parfaitement pour le scénario que vous avez décrit. Écrire vos propres tables / procs / classes est un excellent exercice et vous pouvez obtenir un très bon contrôle sur les moindres détails, mais après l'avoir fait moi-même, j'ai conclu qu'il était préférable d'utiliser uniquement les éléments .NET intégrés. Beaucoup de code existant est conçu pour contourner ce problème, ce qui est bien. Écrire à partir de zéro m'a pris environ 2 semaines et c'était loin d'être aussi robuste que .NET. Vous devez coder tellement de conneries (récupération de mot de passe, verrouillage automatique, cryptage, rôles, une interface d'autorisation, des tonnes de procs, etc.) et le temps pourrait être mieux dépensé ailleurs.

Désolé si je n'ai pas répondu à votre question, je suis comme le gars qui dit d'apprendre c

请先 登录 后评论