2010-12-06 47 views
2

Je vais d'abord décrire le contexte. Je veux avoir une application symfony où je peux créer différentes zones. Dans chacune des zones, vous pouvez avoir différents types d'utilisateurs (ou de rôles). Chaque utilisateur peut avoir plusieurs rôles dans différents domaines.Où implémenter le filtre de sécurité pour les groupes dynamiques

Pour illustrer la question, nous allons définir:

  • 2 zones: "zone 1" et "zone 2".
  • 2 utilisateurs: "Utilisateur 1" et "Utilisateur 2".
  • 2 rôles: "vendeur" et "acheteur".
  • « User 1 » est un vendeur et un acheteur dans « zone 1 »
  • « User 2 » est un vendeur et un acheteur dans « zone 1 » et un acheteur seulement dans « Zone 2 »

Ma question est: qui est le meilleur moyen de vérifier dans les pages restreintes si un utilisateur appartient à une zone donnée et s'il a le rôle requis dans ce domaine.

Après avoir réfléchi un peu, je l'ai fait ce qui suit:

  1. Lorsqu'une zone est créée, je crée aussi un sfGuardGroup par rôle et une sfGuardGroup mondiale pour la région, chaque suffixé avec la zone id. Ainsi, dans notre exemple, nous aurons les rôles:
    • zone 1, les vendeurs-1, les acheteurs-1 pour la zone 1
    • zone 2, les vendeurs-2, les acheteurs-2 pour la zone 2
  2. Les utilisateurs sont ajoutés aux groupes appropriés. Ainsi, dans notre exemple:
    • utilisateur 1 appartiendra aux groupes zone 1, les vendeurs-1 et les acheteurs-1
    • utilisateur 2 appartiendra à la zone-1 groupes, vendeurs-1, les acheteurs-1, zone -2 et acheteurs-2
  3. de l'URL, je sais dans quel domaine nous sommes, par exemple:

À ce moment-là, je suis un peu coincé que je ne peux pas le meilleur endroit pour mettre en œuvre le contrôle d'autorisation: modifier le filtre de protection ? Changer les actions?

Répondre

1

Votre implémentation requise n'est pas supportée par sfGuard donc je vous recommande de créer un nouveau filtre de sécurité supplémentaire.

Vous pouvez créer un nouveau filtre qui étend sfFilter, puis l'ajouter dans filter.yml après le filtre de sécurité existant. Cela signifie que toutes les fonctionnalités de sécurité existantes fournies par sfGuard se poursuivent.

Vous pouvez alors déterminer quelle zone est demandée en regardant le nom du module et le nom d'action (la façon dont vous accédez à ceux-ci est différente en fonction de la version de symfony que vous utilisez, regardez dans sfBasicSecurityFilter pour un indice), puis comparez cela avec les rôles que l'utilisateur actuel utilise sfGuardSecurityUser.

+0

Merci de m'avoir mis sur la bonne voie. Il semble qu'après quelques tests, j'arriverai à aller quelque part en utilisant un sfFilter personnalisé. –