Plusieurs types d'autorisations (rôles) stockés dans la base de données sous forme décimale unique

StackOverflow https://stackoverflow.com/questions/60204

  •  09-06-2019
  •  | 
  •  

Question

J'allais poser ici une question pour savoir si ma conception pour certaines tables de base de données utilisateurs/rôles était acceptable, mais après quelques recherches, je suis tombé sur cette question :

Quelle est la meilleure façon de gérer plusieurs types d’autorisations ?

Cela ressemble à une approche innovante, donc au lieu d'une table de relation plusieurs-à-plusieurs users_to_roles, j'ai plusieurs autorisations définies comme une seule décimale (type de données int, je présume).Cela signifie que toutes les autorisations pour un seul utilisateur sont sur une seule ligne.Cela n'aura probablement aucun sens tant que vous n'aurez pas lu l'autre question et réponse.

Je n'arrive pas à comprendre celui-ci.Quelqu'un peut-il expliquer le processus de conversion ?Cela semble "correct", mais je ne comprends tout simplement pas comment je convertis les rôles en décimal avant qu'ils ne soient insérés dans la base de données, ni comment ils sont reconvertis lorsqu'ils sortent de la base de données.J'utilise Java, mais si vous l'écrasiez, ce serait cool aussi.

Voici la réponse originale au cas où l'autre question serait supprimée :

"Personnellement, j'utilise parfois une énumération d'autorisations avec indicateur.De cette façon, vous pouvez utiliser les opérations au niveau du bit AND, OR, NOT et XOR sur les éléments 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 bit à bit AND.

Par exemple, si un utilisateur peut afficher et modifier des utilisateurs, le résultat binaire de l'opération est 0000 0011, qui converti en décimal est 3.Vous pouvez ensuite stocker l'autorisation d'un utilisateur dans une seule colonne de votre base de données (dans notre cas, ce serait 3).

Dans votre application, vous avez juste besoin d'une autre opération au niveau du bit (OU) pour vérifier si un utilisateur dispose ou non d'une autorisation particulière.

Était-ce utile?

La solution

Vous utilisez des opérations au niveau du bit.Le pseudo-code serait quelque chose comme :

bool HasPermission(User user, Permission permission) {
    return (user.Permission & permission) != 0;
}

void SetPermission(User user, Permission permission) {
    user.Permission |= permission;
}

void ClearPermission(User user, Permission permission) {
    user.Permission &= ~permission;
}

L'autorisation est le type d'énumération défini dans votre message, bien que quel que soit son type, il doit être basé sur un type de type entier.La même chose s'applique au champ User.Permission.

Si ces opérateurs (&, |= et &=) n'ont pas de sens pour vous, lisez les opérations au niveau du bit (ET au niveau du bit et OU au niveau du bit).

Autres conseils

En fait, c'est ainsi que nous déterminons l'autorité au sein d'une application Web assez volumineuse pour laquelle je suis l'administrateur de base de données.

Si vous envisagez de faire quelque chose comme ça, vous bénéficierez vraiment d'un tableau des nombres.Cela rendra vos calculs beaucoup plus rapides.

La configuration de base comprend les tableaux suivants :

  1. Groupes - pour faire plusieurs à plusieurs utilisateurs et points de sécurité
  2. Points de sécurité - qui contiennent une valeur pour l'autorisation anonyme et une pour les utilisateurs authentifiés qui ne font pas partie d'un groupe distinct
  3. Table de jointure de points de sécurité de groupe
  4. Une table de numéros BitMask spéciale qui contient des entrées pour les valeurs ^2.Il y a donc une entrée pour 2 (2) et deux entrées pour trois (2 et 1).Cela nous évite d'avoir à calculer des valeurs à chaque fois.

Nous déterminons d’abord si l’utilisateur est connecté.Si ce n'est pas le cas, nous renvoyons l'autorisation anonyme pour le point de sécurité.

Ensuite, nous déterminons si l'utilisateur est membre d'un groupe associé au point de sécurité via un simple EXISTS utilisant un JOIN.Si ce n'est pas le cas, nous renvoyons la valeur associée à l'utilisateur authentifié.La plupart des valeurs par défaut anonymes et authentifiées sont définies sur 1 sur notre système car nous exigeons que vous apparteniez à des groupes spécifiques.

Note: Si un utilisateur anonyme n'obtient aucun accès, l'interface le renvoie vers une boîte de connexion pour lui permettre de se connecter et de réessayer.

Si l'utilisateur est un membre d'un ou plusieurs groupes, puis on sélectionne des valeurs distinctes dans la table BitMask pour chacune des valeurs définies pour les groupes.Par exemple, si vous apparteniez à trois groupes et aviez un niveau d'autorisation de 8, un de 12 et le dernier de 36, notre sélection par rapport au tableau Bit Mask renverrait respectivement 8, 8 et 4, et 4 et 32.En faisant un distinct on obtient les nombres 4, 8 et 32 ​​qui mordent correctement les masques à 101100.

Cette valeur est renvoyée comme niveau d'autorisation des utilisateurs et traitée par le site Web.

Cela a du sens ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top