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