Je suis à l'aide de Symfony 2.2 et mon expérience légèrement différente de celle - Problématique de l', c'est donc une version combinée de toutes les infos de cette question, en plus de certains de mes propres.
Je pense que Joe est trompé sur la valeur de $providerKey
, le troisième paramètre de la UsernamePasswordToken
constructeur. C'est censé être la clé d'authentification (utilisateur non professionnel. Il est utilisé par le système d'authentification de distinguer entre les jetons créés pour différents fournisseurs. Tout fournisseur qui descend d' UserAuthenticationProvider
va authentifier les jetons dont le fournisseur de la clé correspond à son propre. Par exemple, l' UsernamePasswordFormAuthenticationListener
définit la clé du jeton qu'il crée pour correspondre à celui de son correspondant, DaoAuthenticationProvider
. Qui permet à un seul pare-feu avoir plusieurs nom d'utilisateur+mot de passe prestataires, sans leur marcher sur les autres. Par conséquent, nous devons choisir une clé qui n'entre pas en conflit avec d'autres fournisseurs. J'utilise 'new_user'
.
J'ai un peu de systèmes dans d'autres parties de mon application qui dépendent de l' authentification de la réussite de l'événement, et qui n'est pas tiré par la seule définition de l'jeton sur le contexte. J'ai eu pour obtenir l' EventDispatcher
du récipient, et le feu de l'événement manuellement. Puis j'ai décidé également de déclencher une connexion interactive de l'événement parce que nous sommes l'authentification de l'utilisateur implicitement, pas de réponse explicite de demande de connexion.
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\AuthenticationEvents;
use Symfony\Component\Security\Core\Event\AuthenticationEvent;
$user = // get a Symfony user instance somehow
$token = new UsernamePasswordToken(
$user, null, 'new_user', $user->getRoles() );
$this->get( 'security.context' )->setToken( $token );
$this->get( 'event_dispatcher' )->dispatch(
AuthenticationEvents::AUTHENTICATION_SUCCESS,
new AuthenticationEvent( $token ) );
Notez que l'utilisation d' $this->get( .. )
suppose l'extrait de code est dans une méthode de contrôleur. Si vous utilisez le code quelque part d'autre, vous aurez à changer les appeler ContainerInterface::get( ... )
d'une manière appropriée à l'environnement. Comme il arrive mon entités utilisateur de mettre en œuvre UserInterface
donc je peux l'utiliser directement avec le jeton. Si le vôtre ne pas, vous aurez à trouver un moyen de les convertir en UserInterface
des cas.
Ce code fonctionne, mais j'ai l'impression que c'est le piratage autour de Symfony architecture d'authentification plutôt que de travailler avec elle. Il serait sans doute plus correct de mettre en œuvre un nouveau fournisseur d'authentification avec son propre jeton de classe plutôt que de détourner l' UsernamePasswordToken
. Aussi, à l'aide d'un bon fournisseur voudrait dire que les événements ont été pris en charge pour vous.