Перейти к основному содержимому

Как вручную аутентифицировать пользователя с помощью Spring Security

· 2 мин. чтения

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 .