Size: a a a

Spring Framework and more

2019 November 06

D

Denis in Spring Framework and more
Андрей Силютин
Так ведь это FactoryBean. Он нужен для создания экземпляров Validator
Ни LocalValidatorFactoryBean ни SpringValidatorAdaptor ни Validator не инжектятся, хотя через getBean экземпляр возвращается
источник

KS

Kamo Spertsyan in Spring Framework and more
Spring Boot + Kotlin

Есть интерфейс interface RepA
Есть интерфейс @Repository interface RepB: RepA, JpaRepository<A, B>

В RepB я реализую методы RepA, в сервисе использую @Autowired rep: RepB

Spring ругается на то, что не может реализовать метод интерфейса RepA, несмотря на то, что я его уже реализовал.

Как можно это исправить? Нашёл вот такой вариант, но не хочу плодить лишние реализации, если это возможно..
https://dzone.com/articles/add-custom-functionality-to-a-spring-data-reposito
источник

PD

Plomipu Dmitri in Spring Framework and more
Народ, привет. Мне нужна серьёзная помощь. Короче мне нужно хранить пользователей и их аккаунты(UserPrincipal) не в БД, а локально в List-е, чтобы Spring Sequrity находил пользователя через UserDetailsService его находил по id или другим уникальным параметрам пользователя и паролю именно из List. Я в конфиге уже настроил AuthenticationManagerBuilder список пользователей, который можно использовать для авторизации, но это не работает НИКАК. Хоть меняй passwordEncoder на другой ( хоть на BCryptPasswordEncoder, хоть на устаревший не поддерживаемый для 5-го спринга DelegatingPasswordEncoder ), но авторизация не проходит(
https://gist.github.com/DmitriEst200/c28658a8d9a6b3eb6f434b246b5a8e10) из за ошибки:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
). Я поэтому сомневаюсь, что проблема именно в энкодере, но я даже проверить не могу да и одним из решений что помимо замены энкодера с DelegatingPasswordEncoder на BCryptPasswordEncoder так как я его использую для шифрования пароля, но и ещё мне предлагали использовать свой кастомный или уже готовый провайдер авторизации реализующий интерфейс AuthentificationProvider, но в этом случае я вообще не знаю, какой провайдер мне подойдёт, чтобы сделать стратегию авторизации без использования поиска пользователей по БД и тоже самое по деланию своей кастомной версии. Прочитал про архитектуру спринг секьюрити, но там о провайдерах написано очень мало того, как они между собой отличаются по функционалу:
https://spring.io/guides/topicals/spring-security-architecture

Моя исходная задача: просто написать реализацию залогинивания если пароль и логин верный, не прибегая к хранению и поиску пользователей в БД для потверждения авторизации, а в оперативной памяти( хранение пользователей, связанные с Principal в виде коллекции пользователей или массива: не важно ). Прошу помгите с этим. Скажите: что я делаю не так ? Как можно решить задачу в моём случае ???
источник

in Spring Framework and more
Plomipu Dmitri
Народ, привет. Мне нужна серьёзная помощь. Короче мне нужно хранить пользователей и их аккаунты(UserPrincipal) не в БД, а локально в List-е, чтобы Spring Sequrity находил пользователя через UserDetailsService его находил по id или другим уникальным параметрам пользователя и паролю именно из List. Я в конфиге уже настроил AuthenticationManagerBuilder список пользователей, который можно использовать для авторизации, но это не работает НИКАК. Хоть меняй passwordEncoder на другой ( хоть на BCryptPasswordEncoder, хоть на устаревший не поддерживаемый для 5-го спринга DelegatingPasswordEncoder ), но авторизация не проходит(
https://gist.github.com/DmitriEst200/c28658a8d9a6b3eb6f434b246b5a8e10) из за ошибки:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
). Я поэтому сомневаюсь, что проблема именно в энкодере, но я даже проверить не могу да и одним из решений что помимо замены энкодера с DelegatingPasswordEncoder на BCryptPasswordEncoder так как я его использую для шифрования пароля, но и ещё мне предлагали использовать свой кастомный или уже готовый провайдер авторизации реализующий интерфейс AuthentificationProvider, но в этом случае я вообще не знаю, какой провайдер мне подойдёт, чтобы сделать стратегию авторизации без использования поиска пользователей по БД и тоже самое по деланию своей кастомной версии. Прочитал про архитектуру спринг секьюрити, но там о провайдерах написано очень мало того, как они между собой отличаются по функционалу:
https://spring.io/guides/topicals/spring-security-architecture

Моя исходная задача: просто написать реализацию залогинивания если пароль и логин верный, не прибегая к хранению и поиску пользователей в БД для потверждения авторизации, а в оперативной памяти( хранение пользователей, связанные с Principal в виде коллекции пользователей или массива: не важно ). Прошу помгите с этим. Скажите: что я делаю не так ? Как можно решить задачу в моём случае ???
попробуй без энкодера (NoOpPasswordEncoder)
источник

in Spring Framework and more
Plomipu Dmitri
Народ, привет. Мне нужна серьёзная помощь. Короче мне нужно хранить пользователей и их аккаунты(UserPrincipal) не в БД, а локально в List-е, чтобы Spring Sequrity находил пользователя через UserDetailsService его находил по id или другим уникальным параметрам пользователя и паролю именно из List. Я в конфиге уже настроил AuthenticationManagerBuilder список пользователей, который можно использовать для авторизации, но это не работает НИКАК. Хоть меняй passwordEncoder на другой ( хоть на BCryptPasswordEncoder, хоть на устаревший не поддерживаемый для 5-го спринга DelegatingPasswordEncoder ), но авторизация не проходит(
https://gist.github.com/DmitriEst200/c28658a8d9a6b3eb6f434b246b5a8e10) из за ошибки:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
). Я поэтому сомневаюсь, что проблема именно в энкодере, но я даже проверить не могу да и одним из решений что помимо замены энкодера с DelegatingPasswordEncoder на BCryptPasswordEncoder так как я его использую для шифрования пароля, но и ещё мне предлагали использовать свой кастомный или уже готовый провайдер авторизации реализующий интерфейс AuthentificationProvider, но в этом случае я вообще не знаю, какой провайдер мне подойдёт, чтобы сделать стратегию авторизации без использования поиска пользователей по БД и тоже самое по деланию своей кастомной версии. Прочитал про архитектуру спринг секьюрити, но там о провайдерах написано очень мало того, как они между собой отличаются по функционалу:
https://spring.io/guides/topicals/spring-security-architecture

Моя исходная задача: просто написать реализацию залогинивания если пароль и логин верный, не прибегая к хранению и поиску пользователей в БД для потверждения авторизации, а в оперативной памяти( хранение пользователей, связанные с Principal в виде коллекции пользователей или массива: не важно ). Прошу помгите с этим. Скажите: что я делаю не так ? Как можно решить задачу в моём случае ???
А где UserDetailsService?
источник

H

Human in Spring Framework and more
Plomipu Dmitri
Народ, привет. Мне нужна серьёзная помощь. Короче мне нужно хранить пользователей и их аккаунты(UserPrincipal) не в БД, а локально в List-е, чтобы Spring Sequrity находил пользователя через UserDetailsService его находил по id или другим уникальным параметрам пользователя и паролю именно из List. Я в конфиге уже настроил AuthenticationManagerBuilder список пользователей, который можно использовать для авторизации, но это не работает НИКАК. Хоть меняй passwordEncoder на другой ( хоть на BCryptPasswordEncoder, хоть на устаревший не поддерживаемый для 5-го спринга DelegatingPasswordEncoder ), но авторизация не проходит(
https://gist.github.com/DmitriEst200/c28658a8d9a6b3eb6f434b246b5a8e10) из за ошибки:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
). Я поэтому сомневаюсь, что проблема именно в энкодере, но я даже проверить не могу да и одним из решений что помимо замены энкодера с DelegatingPasswordEncoder на BCryptPasswordEncoder так как я его использую для шифрования пароля, но и ещё мне предлагали использовать свой кастомный или уже готовый провайдер авторизации реализующий интерфейс AuthentificationProvider, но в этом случае я вообще не знаю, какой провайдер мне подойдёт, чтобы сделать стратегию авторизации без использования поиска пользователей по БД и тоже самое по деланию своей кастомной версии. Прочитал про архитектуру спринг секьюрити, но там о провайдерах написано очень мало того, как они между собой отличаются по функционалу:
https://spring.io/guides/topicals/spring-security-architecture

Моя исходная задача: просто написать реализацию залогинивания если пароль и логин верный, не прибегая к хранению и поиску пользователей в БД для потверждения авторизации, а в оперативной памяти( хранение пользователей, связанные с Principal в виде коллекции пользователей или массива: не важно ). Прошу помгите с этим. Скажите: что я делаю не так ? Как можно решить задачу в моём случае ???
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Plomipu Dmitri
Народ, привет. Мне нужна серьёзная помощь. Короче мне нужно хранить пользователей и их аккаунты(UserPrincipal) не в БД, а локально в List-е, чтобы Spring Sequrity находил пользователя через UserDetailsService его находил по id или другим уникальным параметрам пользователя и паролю именно из List. Я в конфиге уже настроил AuthenticationManagerBuilder список пользователей, который можно использовать для авторизации, но это не работает НИКАК. Хоть меняй passwordEncoder на другой ( хоть на BCryptPasswordEncoder, хоть на устаревший не поддерживаемый для 5-го спринга DelegatingPasswordEncoder ), но авторизация не проходит(
https://gist.github.com/DmitriEst200/c28658a8d9a6b3eb6f434b246b5a8e10) из за ошибки:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
). Я поэтому сомневаюсь, что проблема именно в энкодере, но я даже проверить не могу да и одним из решений что помимо замены энкодера с DelegatingPasswordEncoder на BCryptPasswordEncoder так как я его использую для шифрования пароля, но и ещё мне предлагали использовать свой кастомный или уже готовый провайдер авторизации реализующий интерфейс AuthentificationProvider, но в этом случае я вообще не знаю, какой провайдер мне подойдёт, чтобы сделать стратегию авторизации без использования поиска пользователей по БД и тоже самое по деланию своей кастомной версии. Прочитал про архитектуру спринг секьюрити, но там о провайдерах написано очень мало того, как они между собой отличаются по функционалу:
https://spring.io/guides/topicals/spring-security-architecture

Моя исходная задача: просто написать реализацию залогинивания если пароль и логин верный, не прибегая к хранению и поиску пользователей в БД для потверждения авторизации, а в оперативной памяти( хранение пользователей, связанные с Principal в виде коллекции пользователей или массива: не важно ). Прошу помгите с этим. Скажите: что я делаю не так ? Как можно решить задачу в моём случае ???
org.springframework.security.provisioning.InMemoryUserDetailsManager как раз и есть реализация на листе, а точнее на мап, чтобы был более быстрый лукап по username.
источник

PD

Plomipu Dmitri in Spring Framework and more
А где UserDetailsService?
я добавил код этот сервиса в тот гист. Перезагрузите страницу
источник

PD

Plomipu Dmitri in Spring Framework and more
Ruslan Stelmachenko
org.springframework.security.provisioning.InMemoryUserDetailsManager как раз и есть реализация на листе, а точнее на мап, чтобы был более быстрый лукап по username.
ок. Тогда я просто не понимаю почему спринг секьюрити не ищет пользователя через UserDetailService, а жалуется на энкодер. Меня предупреждали, что DelegatingPasswordEncoder устарел со спринга секьюрити 5-го, а у меня счас подкачано 5.1.6.RELEASE, ну я этот энкодер и выпилил и заменил на BCryptPasswordEncoder, но эффект ТАКОЙ ЖЕ: There is no PasswordEncoder mapped for the id "null".
источник

PD

Plomipu Dmitri in Spring Framework and more
попробуй без энкодера (NoOpPasswordEncoder)
пробовал :(. Не робит
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Plomipu Dmitri
ок. Тогда я просто не понимаю почему спринг секьюрити не ищет пользователя через UserDetailService, а жалуется на энкодер. Меня предупреждали, что DelegatingPasswordEncoder устарел со спринга секьюрити 5-го, а у меня счас подкачано 5.1.6.RELEASE, ну я этот энкодер и выпилил и заменил на BCryptPasswordEncoder, но эффект ТАКОЙ ЖЕ: There is no PasswordEncoder mapped for the id "null".
значит в рантайме у вас DelegatingPasswordEncoder. именно ему нужен "id" энкодера-делегата. Бкрипту он не нужен
источник

RS

Ruslan Stelmachenko in Spring Framework and more
И DelegatingPasswordEncoder не устарел с 5го секьюрити, он там кажется только появился. ))
источник

PD

Plomipu Dmitri in Spring Framework and more
Ruslan Stelmachenko
И DelegatingPasswordEncoder не устарел с 5го секьюрити, он там кажется только появился. ))
Может быть вы и правы. Я просто тогда сделал вывод этот из очередного ответа на подобную проблему из Stackoverflow: https://stackoverflow.com/questions/50687770/there-is-no-passwordencoder-mapped-for-the-id-null-in-spring-basic-security/50741518
источник

RS

Ruslan Stelmachenko in Spring Framework and more
но ведь там речь про NoOpPasswordEncoder - это он "устарел" (на самом деле нет). Но не DelegatingPasswordEncoder.
источник

PD

Plomipu Dmitri in Spring Framework and more
Ruslan Stelmachenko
значит в рантайме у вас DelegatingPasswordEncoder. именно ему нужен "id" энкодера-делегата. Бкрипту он не нужен
я бы хотел с вами посоветоваться: а тогда как же мне задать в конфиге WebSequrityConfigurer, чтобы он использовал конкретно мой энкодер ?? Поможет ли если я сделаю объект энкодера в виде бина прост ?? Я просто не знаю куда копать.
источник

PD

Plomipu Dmitri in Spring Framework and more
ааа. Блин. С невнимательностью у меня проблемы ))). Сорри
источник

RS

Ruslan Stelmachenko in Spring Framework and more
не знаю. тут нужно сидеть и разбираться. читать логи. смотреть откуда у вас в рантайме DelegatingPasswordEncoder берется и т.д.

нельзя тут что-то общее посоветовать.

единственное, что я вижу сразу - у вас в конфигурации идет

authenticationManagerBuilder
.userDetailsService(customUserDetailsService)
...
.inMemoryAuthentication()


Такое работать, скорее всего, не будет. Либо одно, либо другое. метод inMemoryAuthentication  под капотом создает InMemoryUserDetailsManager и заданный выше userDetailsService вероятно вообще не используется.
источник

H

Human in Spring Framework and more
Ох уж эта "магия" спринга))
источник

H

Human in Spring Framework and more
Иногда сомневаюсь, что она несет больше пользы чем вреда.
источник

PD

Plomipu Dmitri in Spring Framework and more
@djxak ок. Чтож. Тогда реально остаётся попробовать поиграться с конфигом таким образом, чтобы при попытки авторизации загружать в память сприн секьюрити, либо просто из метода List с пользователями, который будет хавать UserDetailService при поиске запрашиваемого пользователя исходя из его логина или пароля.
источник