1. Обзор
В этой быстрой статье мы сосредоточимся на том, как программно установить аутентифицированного пользователя в Spring Security и Spring MVC.
2. Весенняя безопасность
Проще говоря, Spring Security хранит основную информацию о каждом аутентифицированном пользователе в ThreadLocal
, представленном в виде объекта аутентификации .
Чтобы создать и установить этот объект аутентификации
, нам нужно использовать тот же подход, который Spring Security обычно использует для создания объекта стандартной аутентификации.
Для этого давайте вручную запустим аутентификацию, а затем установим полученный объект Authentication
в текущий SecurityContext
, используемый фреймворком для хранения текущего вошедшего в систему пользователя:
UsernamePasswordAuthenticationToken authReq
= new UsernamePasswordAuthenticationToken(user, pass);
Authentication auth = authManager.authenticate(authReq);
SecurityContext sc = SecurityContextHolder.getContext();
sc.setAuthentication(auth);
После установки Authentication
в контексте мы теперь сможем проверить, аутентифицирован ли текущий пользователь, используя securityContext.getAuthentication().isAuthenticated()
.
3. Весенний МВК
По умолчанию Spring Security добавляет дополнительный фильтр в цепочку фильтров Spring Security, который способен сохранять контекст безопасности ( класс SecurityContextPersistenceFilter ).
В свою очередь, он делегирует сохранение контекста безопасности экземпляру SecurityContextRepository
, по умолчанию — классу HttpSessionSecurityContextRepository .
Итак, чтобы установить аутентификацию для запроса и, следовательно, сделать его доступным для всех последующих запросов от клиента , нам нужно вручную установить SecurityContext
, содержащий аутентификацию
в сеансе HTTP:
public void login(HttpServletRequest req, String user, String pass) {
UsernamePasswordAuthenticationToken authReq
= new UsernamePasswordAuthenticationToken(user, pass);
Authentication auth = authManager.authenticate(authReq);
SecurityContext sc = SecurityContextHolder.getContext();
sc.setAuthentication(auth);
HttpSession session = req.getSession(true);
session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, sc);
}
SPRING_SECURITY_CONTEXT_KEY
— это статически импортированный HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY
.
Следует отметить, что мы не можем напрямую использовать HttpSessionSecurityContextRepository
, потому что он работает в сочетании с SecurityContextPersistenceFilter.
Это связано с тем, что фильтр использует репозиторий для загрузки и сохранения контекста безопасности до и после выполнения остальных определенных фильтров в цепочке, но он использует пользовательскую оболочку для ответа, который передается в цепочку.
Поэтому в этом случае вы должны знать тип класса используемой оболочки и передать его соответствующему методу сохранения в репозитории.
4. Вывод
В этом кратком руководстве мы рассмотрели, как вручную установить аутентификацию
пользователя в контексте Spring Security и как ее можно сделать доступной для целей Spring MVC, сосредоточив внимание на примерах кода, иллюстрирующих простейший способ ее достижения.
Как всегда, образцы кода можно найти на GitHub .