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