|
3 / 3 / 1
Регистрация: 25.12.2014
Сообщений: 63
|
|||||||||||||||||||||
Autowired менеджера аутентификации в Spring Security Filter15.10.2018, 09:49. Показов 1630. Ответов 8
Доброго дня!
Интегрирую токеновую аутентификацию через Spring Security в уже существующий проект на Spring+Hibernate с конфигом в xml. Создал Entity для User, потом DAO, потом Service. Затем я создал фильтр и применил его через web.xml:
Кликните здесь для просмотра всего текста
Проблема заключается в необходимость задать кастомный Authentication Manager. Созданный кастомный менеджер TokenAuthenticationManager должен обращаться к UserService, который требует @Autowired. Код TokenAuthenticationManager Кликните здесь для просмотра всего текста
Кажется, проблема в том, что я выполнил setAuthenticationManager в фильтре, инициализировав сам менеджер оператором new, следствием чего является неработающий @Autowired. С другой стороны, я не могу сделать что-то типа:
Но и объект userService, который является null в такой ситуации, не может быть разыменован в new UserServiceImpl, потому что содержит внутри себя ссылку на DAO (которая тоже Autowired), а DAO — на сессию, и так далее. Можно ли как-то решить проблему доступа к TokenAuthenticationManager в фильтре? Может, можно как-то передать его в конструктор, или передать как-то через конфигурацию, чтобы внутри этого менеджера UserService не был null. Помогите, пожалуйста. Заранее спасибо!
0
|
|||||||||||||||||||||
| 15.10.2018, 09:49 | |
|
Ответы с готовыми решениями:
8
Spring на клиенте и Autowired Spring Autowired Annotation |
|
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
||
| 15.10.2018, 10:30 | ||
|
Ненадо задавать кастомный менеджер. Надо создать кастомный AuthenticationProvider который будет выоплнять авторизацию по токену и добавить его как один из провайдеров в менеджер.
1
|
||
|
3 / 3 / 1
Регистрация: 25.12.2014
Сообщений: 63
|
||||||
| 15.10.2018, 20:40 [ТС] | ||||||
|
KEKCoGEN, спасибо за ответ!
Я погуглил про AuthProvider, и практически не понял конструктивную разницу между ними. Моя реализация менеджера очень напоминала примеры реализации кастомных провайдеров, поэтому я так и не понял, как именно они должны работать вместе и как их подружить. Во всех этих примерах вместо кастомного фильтра на запросы в web.xml прописывается такое:
Кажется, я совсем запутался. Если не затруднит, детализируйте, пожалуйста, что я должен сделать? Правильно ли я понял, что @Autowired юзер-сервиса должен жить в кастомном провайдере? А для чего тогда менеджер? И как правильно сконфигурировать всё это добро, не используя Java config классы?
0
|
||||||
|
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
|
| 15.10.2018, 21:52 | |
|
unit37, нет смысла городить ещё один менеджер. Это избытычно. Провайдер как раз для этих целей. Насчет фильтра я через XML уже несколько лет не конфигурировал поэтому непомню, но вполне может помочь повесить @Component на фильтр. Тогда туда можно будет инжектить менеджер.
Впринципе контекст спринга можно получить и не из бина, но это будет костыль поэтому пример приводить не буду.
1
|
|
|
3 / 3 / 1
Регистрация: 25.12.2014
Сообщений: 63
|
||||||
| 15.10.2018, 23:58 [ТС] | ||||||
|
KEKCoGEN, спасибо вам, но я всё ещё не понимаю, каким способом решить проблему.
Дело в том, что если я вешаю @Component на фильтр, то @Autowired по-прежнему не работает для менеджера внутри фильтра. В то же время, если убрать из web.xml всё, что касается фильтра, повесить @Component, а менеджер передавать в конструкторе с аннотацией @Autowired, то он перестанет быть null, но тогда, естественно, фильтр не применяется:
Получается, что я либо ломаю одно, либо другое .
0
|
||||||
|
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
|
| 16.10.2018, 08:34 | |
|
unit37, в web.xml помню тоже можно было прописывать аргументы и инжектить через сам xml. Думаю это просто нагуглить.
А вообще пора уже на джава конфиг переходить...
0
|
|
|
3 / 3 / 1
Регистрация: 25.12.2014
Сообщений: 63
|
||||||||||||||||
| 16.10.2018, 11:39 [ТС] | ||||||||||||||||
|
KEKCoGEN, спасибо.
Переконфигурировал всё на Java code. Смог всё заинжектить, заавтовайрить. Токен читается, парсится, взаимодействует с репозиторием. Видимо, в конфигурации я умудрился напартачить. Я наверно неправильно использую переданный в super-конструктор фильтра defaultProcessingUrl и matching patterns в конфиге.
Но теперь я на тех же контроллерах, которым не нужна защита, получаю ошибку 400: The request sent by the client was syntactically incorrect. На консоль выводится "Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "null". Но URL не содержит никаких параметров: http://localhost:8080/subjectSections/ Контроллер, который не требуется защищать: Кликните здесь для просмотра всего текста
0
|
||||||||||||||||
|
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
|
| 16.10.2018, 22:26 | |
|
unit37, super() в фильтре не нужен. Фильтр должен искать токен в хедере и если его нет, просто пропускать реквест дальше по цепочке. Проверка авторизации идет дальше.
1
|
|
|
3 / 3 / 1
Регистрация: 25.12.2014
Сообщений: 63
|
|||||||||||
| 17.10.2018, 23:20 [ТС] | |||||||||||
|
Итак, решил возникшие проблемы следующим образом.
1. Полностью выпилил XML-конфигурацию и заменил на Java-код и аннотации. 2. Изменил фильтр: Кликните здесь для просмотра всего текста
3. Изменил менеджер авторизации (выполнил @Autowired для UserService) 4. В конфигурацию Spring Security добавил: Кликните здесь для просмотра всего текста
Все запросы, которые нужно защитить, помечаю аннотацией @Secured Отдельное спасибо KEKCoGEN за оказанную помощь.
0
|
|||||||||||
| 17.10.2018, 23:20 | |
|
Помогаю со студенческими работами здесь
9
Spring Boot @Autowired в коллекцию Spring и аннотации @Configuration & @Autowired Spring - Как сделать Autowired в N объектах класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|