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!