2010-11-18 27 views
1

J'ai un projet symfony et j'aimerais ajouter une fonctionnalité de communautés.permissions avancées/dynamiques sur sfguard - symfony

Tout le monde peut ouvrir une communauté en tant qu'administrateur et inviter les gens à rejoindre la communauté.

L'administrateur dispose de plus d'autorisations qu'un utilisateur de communauté normal.

La chose est, je veux le sfGuardUser de l'utilisateur Syfony, sfguardgroup, sfguardpermission

  1. -t-il un sens d'utiliser l'architecture sfGuard à cette fin?
  2. Comment puis-je vérifier si un utilisateur spécifique a une autorisation spécifique sur un groupe spécifique?

Répondre

3

Hé, cela va vous aider un peu;)

Dans l'action:

class myAccountActions extends sfActions 
{ 
    public function executeDoThingsWithCredentials() 
    { 
    $user = $this->getUser(); 

    // Check if the user has a credential 
    echo $user->hasCredential('foo');      => true 

    // Check if the user has both credentials 
    echo $user->hasCredential(array('foo', 'bar'));  => true 

    // Check if the user has one of the credentials 
    echo $user->hasCredential(array('foo', 'bar'), false); => true 

    // Remove a credential 
    $user->removeCredential('foo'); 
    echo $user->hasCredential('foo');      => false 

    // Remove all credentials (useful in the logout process) 
    $user->clearCredentials(); 
    echo $user->hasCredential('bar');      => false 
    } 
} 

intérieur de la couche:

 <?php if ($sf_user->hasCredential('section3')): ?> 
    .... 
    <?php endif; ?> 

Vous pouvez envisager d'utiliser en plus:

if($user->hasGroup('SOME_GROUP')) 

Source: Symfony inside the layer

+0

Merci. Je n'ai toujours pas eu une seule chose - comment puis-je vérifier une permission sur un groupe spécifique? like - L'utilisateur A a-t-il le type d'autorisation B sur le groupe C. – Yos

+0

if ($ this-> getUser() -> hasCredential ('B') && $ this-> getUser() -> hasGroup ('C')) –

+0

Oui , mais que faire si un utilisateur est un administrateur dans la communauté C, mais un utilisateur régulier dans la communauté D? dans votre code, il n'y a pas de condition comme "l'utilisateur A a un justificatif B sur le groupe C". – Yos

2

-t-il un sens d'utiliser l'architecture sfGuard à cette fin?

Absolument, mais vous aurez besoin de le réparer un peu. Par défaut, Symfony stocke les informations d'identification sur la session, ce qui signifie qu'elles ne seront pas invalidées avant l'expiration de la session. C'est un gros problème lorsque vous vous attendez à voir un effet immédiat en ajoutant quelqu'un à un groupe ou en leur accordant une permission.

Pour résoudre ce problème, vous aurez envie de faire l'une des suivantes:.

  • Charger les informations d'identification sur chaque demande, plutôt que sur signe dans
  • Lorsque les informations d'identification d'un utilisateur changent, les invalider soit via un paramètre de cache global dans APC (vous utilisez APC, non?) ou un paramètre sur le profil de l'utilisateur.

De toute façon, vous devrez vous familiariser avec le système utilisateur Symfony et sfGuardDoctrine. Jetez un oeil à sfGuardSecurityUser::signIn afin que vous sachiez comment les informations d'identification fonctionnent par défaut.

Comment puis-je vérifier si un utilisateur spécifique a une autorisation de spcecific sur un groupe spécifique?

Tristan couvert cette jolie fond. Vous voudrez également jeter un oeil à la sfDoctrineGuard readme. Notez que pour toute solution dans laquelle les modifications des informations d'identification se produisent en direct pour les utilisateurs connectés, vous devrez remplacer la plupart des méthodes listées par Tristan, sinon toutes, pour effectuer une sorte d'invalidation.

En outre, vérifiez this related question, il peut être utile.