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