Ответ 1
Основным является текущий зарегистрированный пользователь. Однако вы извлекаете его через контекст безопасности, привязанный к текущему потоку, и поэтому он также связан с текущим запросом и его сеансом.
SecurityContextHolder.getContext()
внутренне получает текущую реализацию SecurityContext
через переменную ThreadLocal
. Поскольку запрос привязан к одному потоку, вы получите контекст текущего запроса.
Чтобы упростить, вы можете сказать, что контекст безопасности находится в сеансе и содержит пользователя/главную роль и роли/полномочия.
Как получить конкретный пользователь?
Вы этого не сделаете. Все API-интерфейсы предназначены для доступа к пользователю и сеансу текущего запроса. Пусть пользователь A является одним из 100 пользователей, прошедших проверку подлинности. Если A выдает запрос на ваш сервер, он будет выделять один поток для обработки этого запроса. Если вы затем выполните SecurityContextHolder.getContext().getAuthentication()
вы делаете это в контексте этого потока. По умолчанию из этого потока вы не имеете доступа к контексту пользователя B, который обрабатывается другим потоком.
И как я могу различать пользователей, которые делают запросы?
Вам не обязательно, что контейнер Servlet делает для вас.