Рубрики
Без рубрики

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

Узнайте, как программно настроить аутентифицированного пользователя в Spring Security и Spring MVC.

Автор оригинала: baeldung.

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 .