Во-первых, я не использую FOSUserBundle, и я не могу, потому что я портирую унаследованную систему, у которой есть свой собственный уровень модели (без Doctrine/Mongo/whatsoever здесь) и другое очень обычное поведение.
Я пытаюсь подключить мою устаревшую систему ролей к Symfony, поэтому я могу использовать встроенную защиту Symfony в контроллерах и представлениях.
Моя первая попытка состояла в том, чтобы загрузить и вернуть все пользовательские роли в методе getRoles()
из Symfony\Component\Security\Core\User\UserInterface
. Сначала все выглядело так, как будто это сработало. Но после более глубокого взгляда я заметил, что эти роли обновляются только тогда, когда пользователь входит в систему. Это означает, что если я предоставляю или отменю роли от пользователя, ему придется выйти из системы и вернуться, чтобы изменения вступили в силу. Однако, если я отменяю роли безопасности у пользователя, я хочу, чтобы это было немедленно применено, чтобы поведение было неприемлемым для меня.
Я хочу, чтобы Symfony выполнял перезагрузку пользовательских ролей по каждому запросу, чтобы убедиться, что они актуальны. Я внедрил пользовательский поставщик, и его метод refreshUser(UserInterface $user)
вызывается по каждому запросу, но роли каким-то образом не обновляются.
Код для загрузки/обновления пользователя в UserProvider выглядит примерно так:
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
выглядит похожим)
Есть ли способ заставить Symfony обновлять роли пользователей по каждому запросу?