2013-02-27 8 views
6

Dans mon application, je peux modifier les autorisations et les rôles des utilisateurs dans le backend.Réauthentification forcée après modification des autorisations utilisateur

Lorsqu'un utilisateur est connecté et que je supprime un rôle de l'utilisateur, l'utilisateur peut toujours accéder au contenu auquel il n'est plus autorisé à accéder, car il lui manque le rôle. Les modifications prennent effet uniquement lorsque l'utilisateur se reconnecte avec la déconnexion/connexion.

Donc, ma question est, puis-je accéder à la session d'un utilisateur connecté (pas moi)? Je sais que je peux accéder à ma propre session et la détruire, ce qui me force à me reconnecter. Mais je veux obtenir la session de n'importe quel utilisateur qui est connecté. Est-ce possible? Je n'ai pas trouvé de ressources à ce sujet. J'utilise PdoSessionStorage avec symfony2.1 et fosuserbundle.

+0

également demandé ici, sans réponse. http://stackoverflow.com/questions/14184484/how-to-administratively-invalidate-a-session-that-used-remember-me-option – MDrollette

+0

@MDrollette Je pense que cela n'aura pas de réponse. Je pense que la seule solution pourrait être un gestionnaire de session personnalisé –

+0

Il s'agirait simplement de stocker l'ID utilisateur avec l'ID de session dans la table de session. Cela ne semble pas particulièrement difficile mais je ne suis pas sûr de la meilleure approche non plus. – MDrollette

Répondre

9

Créez votre implémentation de classe d'utilisateurs Symfony\Component\Security\Core\User\EquatableInterface.

Si vous renvoyez false à partir de la méthode isEqualTo(), l'utilisateur sera réauthentifié. Utilisez cette méthode pour comparer uniquement les propriétés qui, lorsqu'elles sont modifiées, doivent forcer la réauthentification - rôles dans votre cas.

+0

+1 Ok, je comprends cela. Où dois-je faire ce contrôle? Je dois le faire à chaque demande? –

+0

Il suffit de faire en sorte que votre classe d'utilisateurs implémente l'interface. Vous serez forcé d'implémenter la méthode 'isEqualTo()'. Le reste est géré par Symfony. –

+0

Super ça marche!) –

-1

Vous pouvez contourner ce problème en suivant une approche similaire à ce que je faisais:

  1. Lorsque l'utilisateur se connecte, stocker toutes les autorisations en séance avec une somme de contrôle de ces autorisations.
  2. Enregistrer la même somme de contrôle dans une base de données ou sur le disque, par rapport à cet ID utilisateur
  3. Chaque fois que l'utilisateur fait une demande, vérifiez que la somme de contrôle sur le disque correspond à celle en cours pour cet utilisateur. S'il est différent, rechargez les autorisations dans la session de l'utilisateur
  4. Lorsque vous modifiez les autorisations, mettez à jour la somme de contrôle dans la base de données (ou sur le disque) stockée sur cet utilisateur. Cela va déclencher une resynchronisation sur leur prochaine requête.
+0

Hm semble intéressant mais complexe aussi. Est-ce une sorte de helpdesk que vous développez? –

+0

@artworkad シ ce n'est pas vraiment complexe, il utilise les composants de base de symfony2 comme le conteneur de service, le contexte de sécurité et l'objet de requête pour déterminer ce qu'il faut faire avec les permissions. – JamesHalsall

+0

@Jaitsu, la solution intégrée de Symfony est * si * simple, vous rirez hystériquement. Vois ma réponse. ;) –

Questions connexes