Question

La conception d'un site assez compliqué avec beaucoup de ajax fonctionnant sur une seule page. Je suis arrivé au point où la nécessité d'avoir l'autorisation de faire des choses spécifiques et certains ont besoin d'être arrêtés à l'action de certains utilisateurs. Je l'ai mis en place des rôles d'utilisateur dans ma base de données et que tout fonctionne bien, mais je me demande s'il existe une méthode plus facile / plus sûr pour moi de stocker chaque autorisation.

À l'heure actuelle, lorsqu'un utilisateur se connecte dans leurs autorisations spécifiques sont saisis du db et chargés dans un tableau de session. Pour vérifier si l'utilisateur a la permission, je vérifie simplement si l'autorisation est contenue dans le tableau. Cela semble lent, et presque comme je manque une meilleure solution.

En outre, des sessions peut apparemment être modifié par l'utilisateur ... est-il une méthode plus sûre?

Je l'ai pensé exécuter une requête pour chaque chèque, mais cela pourrait augmenter considérablement le temps de chargement pour une simple demande ajax.

Je suis ouvert à tout et toutes les idées. Merci.

Était-ce utile?

La solution

D'abord et avant tout, l'utilisateur ne peut pas modifier des variables de session. La seule chose qui est enregistré sur la machine de l'utilisateur est un identifiant de session. Ce identifiant est alors utilisé par le serveur pour saisir des paires clé / valeur qui sont stockés uniquement sur le serveur. D'un point de vue du client, il est impossible de modifier les valeurs sur un coup de tête.

Deuxièmement, je ne vous inquiétez pas trop sur une connexion de base de données. Évitez de vous répéter, mais ne vous inquiétez pas trop au sujet de la première connexion.

Enfin, ma façon préférée de faire plusieurs autorisations sans créer de rôles est d'utiliser les mathématiques binaires. Certaines personnes aiment cela, certaines personnes ne sont pas, mais je trouve utile.

Pour utiliser cette méthode, l'imagerie que nous définissons les valeurs suivantes:

CAN_EDIT_SOMETHING        = 1     // Powers of 2
CAN_SEE_SOMETHING_ELSE    = 2
CAN_DO_ADMIN_STUFF        = 4
...                       = 8

Pour donner aux gens des autorisations multiples, utilisez OU binaire

PERMISSIONS = CAN_EDIT_SOMETHING | CAN_DO_ADMIN_STUFF

Pour illustrer comment cela fonctionne, nous pouvons regarder les bits:

   0b0001
OR 0b0100
---------
   0b0101

Pour vérifier si quelqu'un a une autorisation, l'utilisation binaire et

if( PERMISSIONS & CAN_EDIT_SOMETHING != 0 ) {
}

Pour voir comment cela fonctionne, nous regardons les bits à nouveau

    0b0101
AND 0b0001
----------
    0b0001  // Not equal to 0. They must have that permission!

Le dernier avantage de cette méthode est qu'il vous permet de combiner plusieurs autorisations facilement dans « méta-permissions »

// If both EDIT_SOMETHING and ADMIN_STUFF are tasks that an admin
// can perform, we can combine them easily
//
IS_FULL_ADMIN     = CAN_EDIT_SOMETHING | CAN_DO_ADMIN_STUFF


// We can then use this value exactly as we do any other permission
//
PERMISSIONS       = IS_FULL_ADMIN | CAN_SEE_SOMETHING ELSE

Utilisez-le si vous voulez, mais il est un truc agréable d'avoir dans votre arsenal.

Autres conseils

Semble OK pour moi! Vous pouvez regarder un logiciel pour améliorer votre session chache peformance.

Interrogation la DB à chaque fois est pas aussi mauvais que cela puisse paraître! Tout d'abord, vous avez probablement besoin de se connecter à la DB de toute façon, d'autre part si vous interrogé les utilisateurs permisions quand ils ont signé dans les chances sont que toutes les lignes de relevent sont assis dans la mémoire tampon et aucun IO est nécessaire, en troisième lieu une requête pour une seule permision pour un seul utilisateur va être beaucoup plus léger qu'une requête pour tous permisions pour un utilisateur.

Votre explication du modèle semble un peu confus. L'autorisation est le produit de l'autorisation de l'objet et l'autorisation de l'objet. Conservez-vous vraiment ces produits pour chaque combinaison du sujet et de l'objet? C'est une solution très inefficace et très difficile à gérer.

  

En outre, des sessions peuvent apparemment être modifiées par l'utilisateur

WTF ????? !!!!

Les données de session ne doivent jamais être modifiés par les méthodes que vous définissez dans votre code - si les utilisateurs peuvent modifier une partie des données de session de quelque façon qu'ils aiment alors c'est le premier problème, vous devez adresse - jusqu'à ce que vous faites , il sera pratiquement impossible de compter sur une partie de votre méthode d'authentification / autorisation à moins que vous déplacez l'authentification complètement hors du domaine de votre code d'application. (BTW: ce n'est pas la bonne façon de résoudre le problème)

recherche Certainement un très grand tableau (pas sûr du point de rupture réelle - mais dans la région n = 1000 - mais il y a beaucoup de variables qui influent sur ce sujet). Peut être nettement plus lent que la récupération des résultats à partir d'une base de données

Il est difficile de dire ce que vous faites mal sans comprendre comment fonctionne votre système actuel. Est-ce l'un de ces ?

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