Где Symfony хранит информацию о вошедших в систему пользователях?

Я начал проект с symfony 4.3. Код для регистрации и аутентификации пользователей был сгенерирован с помощью консоли, с bin/console make:auth и bin/console make:registration-form, и я особо его не модифицировал.

Теперь у меня есть страница, которая ограничена определенными ролями пользователей. Это настраивается в config/packages/security.yaml, например

security:
    access_control:
    - { path: ^/admin, roles: ROLE_ADMIN }

У меня также есть форма, которая позволяет мне изменять роль пользователя. Теперь суть проблемы: если я изменю роль пользователя, который в данный момент подключен, страницы, к которым он может получить доступ, не изменятся, пока он не выйдет из системы и не войдет снова. Поскольку база данных правильно обновлена, это означает, что его прежняя роль все еще где-то хранится. Мне нужно знать, где, чтобы я мог обновить его, не заставляя его выходить из системы и снова входить в нее.

Я не думаю, что это в обычном файле, так как find . -mmin 5 ничего не находит после того, как я создаю нового пользователя и захожу под ним. Я видел упоминание var/cache//session, но у меня нет этого каталога. Я тоже ничего не вижу в базе данных, как и никаких файлов cookie с информацией в моем браузере.

Итак, где Symfony хранит информацию о зарегистрированных пользователях?


https://stackoverflow.com/a/57676864/11410707

Это решает (частично) мою проблему, но только если я изменяю текущего пользователя, а не другого. Меня еще интересует, где хранятся токены.


Вопрос был заблокирован, хотя две ссылки не дают ответа, так что вот он для записи:

Информация о зарегистрированных пользователях хранится в сеансах PHP каждого пользователя. В свою очередь, сеансы PHP хранятся в виде простого файла в каталоге /var/opt/remi/php73/lib/php/session/ (по крайней мере, в моей установке CentOS).

Доступ к каждому сеансу может получить только соответствующий пользователь, идентифицированный файлом cookie PHPSESSID. Таким образом, невозможно напрямую обновить сеанс удаленного пользователя.


person user153991    schedule 10.01.2020    source источник
comment
Пользователь хранится в сеансах: вы можете найти, как обновить его здесь   -  person GrenierJ    schedule 10.01.2020
comment
Везде, куда я смотрел, был доступ только к сеансу текущего пользователя, возможно ли вообще получить доступ к сеансу другого пользователя?   -  person user153991    schedule 10.01.2020
comment
Вы не можете получить доступ к сеансу другого пользователя. Я думаю, вам следует обновить метод refreshUser для UserProvider, чтобы обновить роли, когда пользователь приходит и сеанс перезагружается.   -  person GrenierJ    schedule 10.01.2020
comment
Также этот: stackoverflow.com/questions/9220975/   -  person yivi    schedule 10.01.2020
comment
@yivi Первый вопрос объясняет, как обновить текущего пользователя, в то время как я хочу обновить другого произвольного пользователя. Я не думаю, что смогу адаптировать метод, объясняющий это, я не могу получить доступ к сеансу этого другого пользователя. Второй вопрос, что я хочу сделать, но описанный метод мне не подошел. Поскольку не было много объяснений, я не мог устранить неполадки, отсюда и мой текущий вопрос.   -  person user153991    schedule 10.01.2020
comment
@GrenierJ Я посмотрю на это, спасибо.   -  person user153991    schedule 10.01.2020


Ответы (1)


Создайте новый токен и обновите

$user->addRole('ROLE_****');

$token = new UsernamePasswordToken($user,null,'main',$user->getRoles());

$this->container->get('security.context')->setToken($token);
$userManager = $this->container->get('fos_user.user_manager');
$userManager->refreshUser($user);
person Hamza Betouar    schedule 10.01.2020