Quand les rôles des utilisateurs sont-ils rafraîchis et comment les forcer?

tout d'abord, je n'utilise pas FOSUserBundle et je ne peux pas parce que je porte un ancien système qui a sa propre couche de modèle (pas de Doctrine/Mongo/quoi que ce soit ici) et d'autres comportements très personnalisés.

j'essaie de connecter mon système de rôle d'origine avec Symfony's pour que je puisse utiliser la sécurité de symfony native dans les contrôleurs et les vues.

Ma première tentative a été de charger et de retourner tous les rôles de l'utilisateur dans le getRoles() méthode de l' SymfonyComponentSecurityCoreUserUserInterface. Au début, ça ressemblait à ça a fonctionné. Mais après un examen plus approfondi, j'ai remarqué que ces rôles ne sont rafraîchis que lorsque l'utilisateur se connecte. Cela signifie que si j'accorde ou révoque des rôles d'un utilisateur, il devra se déconnecter et revenir pour que les changements entrent en vigueur. Cependant, si je révoque les rôles de sécurité d'un utilisateur, je veux que ce soit appliqué immédiatement, de sorte que ce comportement ne soit pas acceptable pour moi.

ce que je veux que Symfony fasse est de recharger les rôles d'un utilisateur sur chaque demande pour s'assurer qu'ils sont à jour. J'ai mis en œuvre un custom fournisseur utilisateur et ses refreshUser(UserInterface $user) la méthode est appelée sur chaque requête mais les rôles ne sont pas rafraîchis.

le code pour charger / rafraîchir l'utilisateur dans mon UserProvider ressemble à quelque chose comme ceci:

public function loadUserByUsername($username) {
    $user = UserModel::loadByUsername($username); // Loads a fresh user object including roles!
    if (!$user) {
        throw new UsernameNotFoundException("User not found");
    }
    return $user;
}

(refreshUser ressemble)

y a-t-il un moyen de rafraîchir les rôles des utilisateurs de Symfony sur chaque requête?

20
demandé sur CSchulz 2012-12-10 14:02:22

7 réponses

donc après quelques jours à essayer de trouver une solution viable et à contribuer à la liste de diffusion des utilisateurs de Symfony2, Je l'ai finalement trouvé. Ce qui suit a été tiré de la discussion à https://groups.google.com/d/topic/symfony2/NDBb4JN3mNc/discussion

Il s'avère qu'il y a une interface Symfony\Component\Security\Core\User\EquatableInterface qui n'est pas destiné à comparer l'identité de l'objet mais précisément à

test si deux objets sont égaux en sécurité et contexte de réauthentification

implémentez cette interface dans votre classe d'utilisateurs (celle qui implémente déjà