Моя компания изучает Spring MVC, чтобы определить, следует ли использовать его в одном из наших следующих проектов. Пока мне нравится то, что я видел, и прямо сейчас я смотрю на модуль Spring Security, чтобы определить, можем ли мы / должны ли это использовать.
Наши требования безопасности довольно простые; пользователю просто нужно иметь возможность указать имя пользователя и пароль, чтобы иметь доступ к определенным частям сайта (например, для получения информации о своей учетной записи); и на сайте есть несколько страниц (часто задаваемые вопросы, поддержка и т. д.), к которым должен быть предоставлен доступ анонимному пользователю.
В прототипе, который я создавал, я хранил объект «LoginCredentials» (который просто содержит имя пользователя и пароль) в Session для аутентифицированного пользователя; некоторые контроллеры проверяют, находится ли этот объект в сеансе, чтобы, например, получить ссылку на имя пользователя, вошедшего в систему. Я хочу заменить эту самодельную логику на Spring Security, которая имела бы приятное преимущество в виде удаления любого вида «как мы отслеживаем пользователей, вошедших в систему?» и "как мы аутентифицируем пользователей?" из моего контроллера / бизнес-кода.
Похоже, что Spring Security предоставляет объект «контекста» (для каждого потока), чтобы иметь возможность получить доступ к информации об имени пользователя / принципале из любого места в вашем приложении ...
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
... что очень не похоже на Spring, поскольку этот объект в некотором роде (глобальный) синглтон.
Мой вопрос таков: если это стандартный способ доступа к информации об аутентифицированном пользователе в Spring Security, то каков приемлемый способ ввести объект аутентификации в SecurityContext, чтобы он был доступен для моих модульных тестов, когда модульные тесты требуют аутентифицированный пользователь?
Нужно ли мне подключать это к методу инициализации каждого тестового примера?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
Это кажется излишне многословным. Есть способ попроще?
Сам SecurityContextHolder
объект кажется очень не похожим на Spring ...