Question

Je fais partie d’une équipe qui crée une application Web en utilisant PHP et MySQL. L'application aura plusieurs utilisateurs avec des rôles différents. L'application sera également utilisée de manière géographiquement répartie. Par conséquent, nous devons créer un système de contrôle d'accès fonctionnant aux deux niveaux suivants:

  1. Contrôle les autorisations des utilisateurs pour des pages php spécifiques, c’est-à-dire fournit ou refuse l’accès à des pages spécifiques (ou à des éléments de l’interface utilisateur) en fonction du rôle de l’utilisateur. Par exemple, un utilisateur peut être autorisé à accéder au " Etudiants " page, mais pas vers le " Enseignants " page.
  2. Contrôle les autorisations utilisateur pour des enregistrements de base de données spécifiques, par exemple, modifie les requêtes de base de données afin que seuls les enregistrements spécifiques soient affichés. Par exemple, pour un utilisateur au niveau de la ville, seuls les enregistrements associés à sa ville particulière doivent être affichés, tandis que pour un utilisateur au niveau national, les enregistrements de TOUTES LES VILLES du pays doivent être affichés.

J'ai besoin d'aide pour concevoir un système capable de gérer ces deux types de contrôle d'accès. Point no 1 semble être assez simple. Cependant, je ne sais absolument pas comment faire le point 2 sans coder en dur les informations dans les requêtes SQL.

Toute aide serait appréciée.

Merci d'avance

Vinayak

Était-ce utile?

La solution

J'étais dans une situation similaire il y a quelques mois. J'ai trouvé que des outils tels que Zend_ACL fonctionnent très bien si vous vérifiez simplement le niveau d'accès à un seul élément (ou à un nombre raisonnablement faible d'entre eux). Il échoue lorsque vous devez obtenir une liste énorme d'éléments auxquels l'utilisateur est autorisé à accéder. J'ai conçu une solution personnalisée à ce problème en utilisant le modèle de délégué commercial . BD fournit une logique métier pouvant être appliquée dans un contexte spécifique. Dans ce scénario, une logique SQL a été livrée et utilisée comme condition de filtrage dans subselect. Voir les schémas suivants:

 alt text
(source: epsi.pl ??)

Et un diagramme de séquence illustrant l'ordre des appels:

 alt text
(source: epsi.pl ??)

J'ai publié un blog sur cette solution , malheureusement, tout est en polonais, mais vous pouvez trouver des morceaux de code et des diagrammes à portée de main. Ce que je peux dire, la mise en œuvre n'est pas un jeu d'enfant, mais en termes de performances, c'est un champion par rapport à la vérification d'accès itérative pour chaque élément de la liste. De plus, l’infrastructure ci-dessus ne traite pas seulement un type d’éléments de la liste. Il peut servir lors de l'accès à différentes listes, qu'il s'agisse d'une liste de villes, de pays, de produits ou de documents, à condition que les éléments de la liste implémentent l'interface IAuthorizable .

Autres conseils

Vous ne connaissez pas les détails de votre problème, mais le Zend Framework a un puissant ACL et AUTH , ensemble de composants peut vouloir regarder. Bonnes choses comme un contrôle d’accès très précis, le stockage de données pour la persistance, des règles conditionnelles avancées.

Il me semble que ce dont vous avez besoin est le suivant: (Je vais utiliser un exemple de pays / État / ville)

  1. Une liste de tous les pays. Chaque " pays " a un identifiant.
  2. Une liste de tous les États au sein des pays. Chaque état est lié à l'ID du pays, mais possède également son propre identifiant unique.
  3. Une liste de toutes les villes. Chaque ville est liée à un État ou directement à un pays et possède un drapeau pour indiquer lequel.

Pour un utilisateur de la ville, il est évident que vous recherchez et affichez uniquement les enregistrements de la ville qui correspondent à leur ID. Toutefois, pour un état ou un niveau national, recherchez tous les enregistrements concernant chaque ville ayant un identifiant correspondant à cette nation (ou cet état ou ce que vous avez).

Donc, fondamentalement, chaque sous-groupe dépend du groupe situé au-dessus de lui et, même si je ne me souviens pas bien, je pense que vous pouvez utiliser des sous-requêtes pour faire l'affaire à partir de là.

Si vous ne savez pas comment faire cela, j'utiliserais un framework php tel que Zend Framework, CakePHP ou Symphony. Ils ont fait le gros du travail pour vous et ont déjà mis en place un système de contrôle d'accès.

J'ai une solution similaire à créer et, jusqu'à présent, j'ai décidé d'utiliser des spécifications et des rôles. En fait, un rôle aurait des spécifications de privilège attachées. S'ils sont tous satisfaits, l'autorisation est accordée, sinon, il revient à l'accès par défaut aux ressources.

Je cherchais quelqu'un qui implémentait déjà la solution, mais il semble que personne ne l'ait fait. Espérons que ce ne sera pas un échec:)

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