Como recarregar seu usuário após mudanças no Symfony2

Então, cerca de uma semana atrás, fui questionado por que nossa entidade User não tinha as funções adequadas depois que atualizamos as funções. Logo ficou claro que a sessão não foi reiniciada, então o usuário ainda tinha suas permissões antigas até que você as forçasse a atualizá-las.

Depois de algumas pesquisas, descobri este exemplo:

protected function reloadUserPermissions()
{
$token
= new UsernamePasswordToken(
$this
->user,
null,
'main',
$this
->user->getRoles()
);

$this
->securityContext->setToken($token);
}

E então tudo estava bem, mas não parecia certo fazer toda essa lógica cada vez que algo mudava.

Depois de uma pesquisa mais extensa, descobri que o Symfony já tem uma solução integrada para este problema e é chamada de “EquatableInterface”. Esta interface força você a implementar uma função chamada “isEqualTo (UserInterface $ user)” esta função permite que você verifique se um determinado valor de seu objeto de usuário mudou e se assim for, ele recarregará seu token de usuário.

class User implements EquatableInterface
{

...

public function isEqualTo(UserInterface $user)
{
if ($user instanceof User) {
// Check that the roles are the same, in any order
$isEqual
= count($this->getRoles()) == count($user->getRoles());
if ($isEqual) {
foreach($this->getRoles() as $role) {
$isEqual
= $isEqual && in_array($role, $user->getRoles());
}
}
return $isEqual;
}

return false;
}

Você pode usar qualquer campo vinculado ao seu usuário para forçar uma recarga, tudo o que você precisa retornar é falso e o usuário será recarregado.

fonte: http://api.symfony.com/2.6/Symfony/Component/Security/Core/User/EquatableInterface.html

Todas as minhas dicas foram movidas para o meu blog www.pix-art.be, então venha conferir!