1. Обзор
В этой краткой статье мы сосредоточимся на том, как программно настроить аутентифицированного пользователя в Spring Security и Spring MVC.
2. Весенняя Безопасность
Проще говоря, Spring Security хранит основную информацию каждого аутентифицированного пользователя в ThreadLocal – представлен как Аутентификация объект.
Чтобы построить и установить этот Аутентификация объект – нам нужно использовать тот же подход, который Spring Security обычно использует для построения объекта на основе стандартной аутентификации.
Чтобы, давайте вручную инициируем аутентификацию, а затем установим результирующий Аутентификация объект в текущий SecurityContext , используемый платформой для хранения текущего пользователя, вошедшего в систему:
UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); sc.setAuthentication(auth);
После установки Аутентификации в контексте мы теперь сможем проверить, аутентифицирован ли текущий пользователь – с помощью SecurityContext.getAuthentication().IsAuthenticated() .
3. Пружинный MVC
По умолчанию Spring Security добавляет дополнительный фильтр в цепочку фильтров безопасности Spring, который способен сохранять контекст безопасности ( 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 и как его можно сделать доступным для целей Spring MVC, сосредоточив внимание на примерах кода, которые иллюстрируют простейший способ его достижения.
Как всегда, примеры кода можно найти на GitHub .