Как вручную аутентифицировать пользователя с помощью Spring Security
1. обзор
В этой быстрой статье мы сосредоточимся на том, как программно настроить аутентифицированного пользователя в Spring Security и Spring MVC.
2. Spring Security
Проще говоря, Spring Security хранит основную информацию о каждом аутентифицированном пользователе вThreadLocal - представленном как объектAuthentication.
Чтобы создать и установить этот объектAuthentication, нам нужно использовать тот же подход, который Spring Security обычно использует для создания объекта при стандартной аутентификации.
Чтобы, давайте вручную инициируем аутентификацию, а затем установим полученный объектAuthentication в текущийSecurityContext, используемый фреймворком для хранения текущего вошедшего в систему пользователя:
UsernamePasswordAuthenticationToken authReq
= new UsernamePasswordAuthenticationToken(user, pass);
Authentication auth = authManager.authenticate(authReq);
SecurityContext sc = SecurityContextHolder.getContext();
securityContext.setAuthentication(auth);
После установкиAuthentication в контексте мы теперь сможем проверить, аутентифицирован ли текущий пользователь - используяsecurityContext.getAuthentication().isAuthenticated().
3. Spring MVC
По умолчанию Spring Security добавляет дополнительный фильтр в цепочку фильтров Spring Security, который может сохранять контекст безопасности (классSecurityContextPersistenceFilter).
В свою очередь, он делегирует сохранение контекста безопасности экземпляруSecurityContextRepository, по умолчанию классHttpSessionSecurityContextRepository.
Итак, чтобы установить аутентификацию для запроса и, следовательно,make it available for all subsequent requests from the client, нам нужно вручную установитьSecurityContext, содержащийAuthentication в сеансе 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. Заключение
В этом кратком руководстве мы рассмотрели, как вручную установить пользователяAuthentication в контексте безопасности Spring и как его можно сделать доступным для целей Spring MVC, сосредоточив внимание на примерах кода, которые иллюстрируют простейший способ достижения этой цели.
Как всегда, образцы кода можно найтиover on GitHub.