«1. Обзор

В этой быстрой статье мы сосредоточимся на том, как программно установить аутентифицированного пользователя в Spring Security и Spring MVC.

2. Spring Security

Проще говоря, 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 MVC

По умолчанию 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 и как сделать ее доступной для целей Spring MVC, сосредоточив внимание на примерах кода, иллюстрирующих простейшие способ добиться этого.

Как всегда, образцы кода можно найти на GitHub.