Создание REST API с использованием Spring WebFlux и Security

Поділитися
Вставка
  • Опубліковано 15 чер 2024
  • В данном видео рассмотрен пример создания REST API с использованием следующих технологий:
    - Spring Boot 3
    - Spring Security (JWT)
    - Spring WebFlux
    - Spring Data R2DBC
    - MapStruct
    - PostgreSQL
    - Flyway
    Ссылка на Github репозиторий:
    github.com/proselytear/webflu...
    Наше дружное сообщество:
    t.me/pse_club
    Материалы для разработчиков:
    proselyte.net/
    00:00:00 Введение
    00:00:20 Создание проекта
    00:11:36 Создание миграций БД
    00:15:40 Создание базовых классов
    00:23:20 Реализация логики генерации JWT токена
    00:46:30 Реализация логики валидации JWT токена
    00:53:05 Построения цепочки аутентификации
    01:04:22 Финальная конфигурация с использованием SecurityWebFilterChain
    01:12:11 Реализация REST контроллеров
    01:23:15 Проверка REST API средствами Postman
    01:24:21 Добавление и конфигурация обработчика ошибок
    01:25:40 Заключение

КОМЕНТАРІ • 239

  • @user-lk8n0fgjk
    @user-lk8n0fgjk Рік тому

    Евгений, спасибо за качественный и постоянный контент!

  • @nsandrus
    @nsandrus Рік тому +3

    Отличная подача материала. Благодарю за урок и потраченное на его создание время.

  • @mikalaim7690
    @mikalaim7690 Рік тому +4

    Большой респект за ваши видео, пожалуйста, продолжайте

  • @divergenny
    @divergenny Рік тому +4

    Ураааа спасибо огромное ))))) Как и просил вас про спринг секьюрити. Вы лучший!)

  • @user-nz8zq3gj1f
    @user-nz8zq3gj1f Рік тому

    Посмотрел чуть ли не на одном дыхании, спасибо! Узнал много нового для себя

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      Спасибо за отзыв, рад, что материал оказался полезен!

  • @-boiadeiro-
    @-boiadeiro- Рік тому

    Очередное полезное видео, спасибо Евгений!

  • @nurbekabdirasulov1150
    @nurbekabdirasulov1150 Рік тому +1

    Отличный, полезный понятный урок благодарен вам коллега!

  • @user-bq6xi8vd3u
    @user-bq6xi8vd3u Рік тому +3

    Здоровья тебе! Большое спасибо!

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +2

      Спасибо за комментарий и пожелания! Взаимно!

  • @user-it1ms8jn1x
    @user-it1ms8jn1x Рік тому +11

    Евгений, огромное спасибо за труды, было очень приятно и полезно смотреть, очень крутой уровень донесения информации! Не сразу все понятно, надо пару раз вдумчиво пересмотреть, но это круто, снимаю шляпу.

  • @sk-xdv-fre
    @sk-xdv-fre Рік тому

    Отличный урок, большое вам спасибо!

  • @Amberdance
    @Amberdance Рік тому

    Спасибо за материал! Свежо и актуально (особенно на фоне видео с 3+ летней давности по спрингу), подписка.

  • @webicode
    @webicode 10 місяців тому

    Урок супер ! Подача материала класс !

  • @kovashgang7110
    @kovashgang7110 10 місяців тому

    Супер, не только реактивщина, но и еще куча полезных мелочей. Однозначно топ контент.

  • @user-ti7wk4qt6s
    @user-ti7wk4qt6s 11 місяців тому

    Наконец-то актуальное видео на эту тему! Спасибо большое!

    • @EugeneSuleimanov
      @EugeneSuleimanov  11 місяців тому

      Спасибо за комментарий!

  • @vladimirkrylov4947
    @vladimirkrylov4947 Рік тому

    Спасибо Евгений! Отличная подача и содержание. недавно делал авторизацию на реактивщине, но все равно посмотрел видос.

  • @Devivl
    @Devivl Рік тому +1

    Большое спасибо за видео, Евгений! Однозначно must have для всех людей, изучающие Java! Что в ютубе, что в телеграмм канале максимально собранная и четкая речь! Очень приятно читать и слушать.

  • @Kiberpiest1
    @Kiberpiest1 Рік тому +2

    Огромное спасибо! Урок супер!

  • @alexshutov5442
    @alexshutov5442 Рік тому +10

    пушка. Очень ждал чего-нибудь реактивненького)

  • @krskvvld
    @krskvvld Місяць тому

    Спасибо огромное за такой видеоурок!

  • @dendenovich8460
    @dendenovich8460 Рік тому

    Огромнейшее спасибо!
    Что бы я без вас делал!)

  • @user-bt9hx3ik6e
    @user-bt9hx3ik6e Рік тому

    ооо видео по реактивности!афигенно. спасибо! а можно видео по реактивности именно по теории. что это такое, что дает, в общих чертах как устроено

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      Спасибо за отзыв!
      По видео - попробую поставить в очередь :)

  • @user-ks3fb4no5b
    @user-ks3fb4no5b 3 місяці тому +1

    Евгений, 100 тысяч спасибо!!! Именно то, что искала и еще и в Вашей великолепной подаче😁 ну просто 100 из 100!

    • @EugeneSuleimanov
      @EugeneSuleimanov  3 місяці тому

      Большое спасибо за отзыв!

  • @Anticipant
    @Anticipant Рік тому +3

    все время удивляюсь вам, спасибо за лучший бесплатный контент по Java и не только!

  • @alexanderlepekhin9684
    @alexanderlepekhin9684 8 місяців тому

    Большое спасибо за урок! Очень порадовало увеличение размера шрифта, никто обычно об этом не заботится

  • @user-br4gt7xu2j
    @user-br4gt7xu2j 2 місяці тому +2

    Суперское видео! Столько информации полезной. Есть несколько вопросов:
    1) зачем в ДТО id? Ведь мы работаем с этими id только в нашей системе. И зачем в ДТО enum? Почему не строка? Ведь чем проще типы данных в ДТО, тем проще с ними работать во внешних системах и на клиенте.
    2) почему в целом не сделал ДТО иммутабельным? По логике любой ДТО не должен изменяться, а служит лишь для передачи данных.
    3) почему в UserEntity hashcode() не по полю username? это поле уникально и обязательно, поэтому было бы логично избежать таким образом возможных проблем рассчета хэша при добавлении полей в будущем(например в случае зацикливания и т.п.), тут такого не предвиделось, но в целом в качестве хорошей практики.
    4) почему секретные проперти(пароли, секреты) задаются напрямую, а не через переменные окружения?

    • @EugeneSuleimanov
      @EugeneSuleimanov  2 місяці тому +1

      Спасибо за отзыв и вопросы!
      1. ID часто отдают в DTO, enum позволит сразу отсечь некорректные значения.
      2. Не всегда удобно для тестирования
      3. корректное замечание, можно было сделать и так.
      4. Учебный проект, поэтому для удобства работы хардкод.

  • @user-uj8ep6fe3k
    @user-uj8ep6fe3k Рік тому +4

    Уже бьюсь в экстазе от используемых технологий в начале видео) спасибо за прекрасный вечер)

  • @alexdiz4189
    @alexdiz4189 Рік тому

    лучшее видео из актуального по данной теме! лайк, подписка

  • @igorpavlenkov3658
    @igorpavlenkov3658 Рік тому +1

    Видео очень интересное, спасибо!

  • @user-nh7tp8xj8y
    @user-nh7tp8xj8y Рік тому

    Евгений, спасибо отличный материал!!

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      Спасибо за отзыв, Роман!

    • @user-nh7tp8xj8y
      @user-nh7tp8xj8y Рік тому

      @@EugeneSuleimanov Очень хотелось бы увидеть как тестировать такие ресты, создание, валидация токена. Если сделаете такое видео, то будет супер классно, а так отличная работа - моё почтение ))

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      @@user-nh7tp8xj8y добавлю в очередь, спасибо за идею!

  • @user-wt1hc4hm3t
    @user-wt1hc4hm3t Рік тому

    Контент ТОП, ждем продолжения.

  • @user-lt8vv5lk1w
    @user-lt8vv5lk1w Рік тому

    Спасибо, очень полезное видео. Чтобы не писать скрипты для базы справа вкладка, в ней удобней и быстрее все делать. Если это скрипт стартовый для создания с нуля, то так же проще через вкладку создать всё таблицы, потом делаем дамп скелета и вставляем куда нужно

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      Спасибо за отзыв! Flyway надёжнее, ИМХО 😊

  • @MgsMen
    @MgsMen Рік тому +2

    От души❤❤❤ Это прям супер топ🎉🎉🎉🎉

  • @user-ew1du4kp1z
    @user-ew1du4kp1z Рік тому +4

    Привет. Спасибо, было очень полезно. Я у тебя уже не первый раз вижу как ты старательно проверяешь время истечения токена, но это вроде не так работает. там Jwts.parser() упадет с JwtException если токен протух и твоя логика не сработает. А в остальном очень круто!

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +1

      Спасибо за комментарий!
      Обязательно проверю этот момент, спасибо.

  • @user-vt6jc3pd1k
    @user-vt6jc3pd1k 11 місяців тому

    Спасибо, полезное очень видео

  • @user-zm2ft7lo7g
    @user-zm2ft7lo7g Рік тому

    Крутой ты мужик , спасибо 🎉

  • @user-lx4dc1ls3e
    @user-lx4dc1ls3e Рік тому +6

    Долгожданное видео!!! Спасибо, Евгений за КАЧЕСТВЕННЫЙ контент👍👍👍

  • @user-dn8mt1ct9x
    @user-dn8mt1ct9x 7 місяців тому

    Евгений, спасибо за работу, у Вас очень хорошее объяснение и интересный подход. Хотелось бы посмотреть, как построить систему безопасности на spring cloud webflux jwt, потому что на монолитные приложения можно найти примеры, а вот на микросервисные к сожалению нет, да и в принципе на микросервисы почему-то меньше информации.

    • @EugeneSuleimanov
      @EugeneSuleimanov  7 місяців тому +1

      Спасибо за отзыв!
      Большой цикл по микросервисам в работе. К сожалению, по срокам не могу сориентировать из-за высокой рабочей загруженности.

  • @alenache1
    @alenache1 Рік тому +4

    как всегда 🔥🔥🔥🔥🔥

  • @reestts
    @reestts 11 місяців тому

    Спасибо за видео 👍

    • @EugeneSuleimanov
      @EugeneSuleimanov  11 місяців тому

      Спасибо за комментарий!

  • @kalivanich
    @kalivanich Рік тому

    Лучший на ютубе!)

  • @Batyrbala
    @Batyrbala Рік тому

    Женя, на высоте,как обычно! Рахмет,сенсей за труды,видно,что потратил время!

  • @pawsdev
    @pawsdev 10 місяців тому

    Не хватает только refresh token логики, хорошая идея для нового видосика на след год))

    • @EugeneSuleimanov
      @EugeneSuleimanov  10 місяців тому

      Спасибо за комментарий и предложение :)

  • @oldjohn1503
    @oldjohn1503 Рік тому

    Золото просто!)

  • @pawsdev
    @pawsdev 10 місяців тому

    Очень круто!!!!

  • @baxiskerimzade2690
    @baxiskerimzade2690 Рік тому

    Супер) Спасибо

  • @mirnijalexey2765
    @mirnijalexey2765 Рік тому

    Спасибо, очень интересно получилось, сделал вместе с тобой!=) Может теперь напилим контроллеров на эту секьюрность?

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +1

      Спасибо за отзыв :)
      Это уже не интересно - всегда можно поиграть муже готовым движком :)
      Следующий этап - прокрутить другие сервисы к этому проекту.

    • @mirnijalexey2765
      @mirnijalexey2765 Рік тому

      @@EugeneSuleimanov новые сервисы это отлично, будешь видео делать?

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +1

      @@mirnijalexey2765 планирую.

  • @user-qx3jt8fw1v
    @user-qx3jt8fw1v Рік тому

    Топ как всегда !

  • @102hem
    @102hem 9 місяців тому

    Как всегда топ контент без воды спасибо! Только вопрос возник, а что там на продакшене с паролем, хоть и рест метод пост приходит разве это будет считаться безопасным? или может на фронте должен кодироваться?

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 місяців тому

      Спасибо за отзыв!
      https обеспечивает безопасность передачи данных.

  • @kalivanich
    @kalivanich Рік тому

    Спасибо, супер!

  • @vadympylypchenko5801
    @vadympylypchenko5801 Рік тому

    Спасибо большое за качетвенный контент без "воды".
    Как много реактивного программирования используеться в реальных проектах?

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +1

      Спасибо за отзыв!
      В моём опыте - крайне много. За последние 3 года все проекты были на «реактивщине».

    • @vadympylypchenko5801
      @vadympylypchenko5801 Рік тому

      @@EugeneSuleimanov Спасибо, ого не неожиданно.

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +1

      @@vadympylypchenko5801 но это точно мой опыт.

  • @alexshutov5442
    @alexshutov5442 Рік тому

    Давай прикрутим кафку и ELK =) А то спрашивают много, а понимания мало)

  • @alexey1930
    @alexey1930 Рік тому

    Спасибо.

  • @VladikBezsmertnyi
    @VladikBezsmertnyi Рік тому

    Прикольно

  • @pawsdev
    @pawsdev 10 місяців тому

    Хотелось бы поинтересоваться зачем 3 перегруженных generateToken? можно же все пихнуть в один метод? Вижу объяснение только в single responsability principle, гипотетически можно сделать развилку на втором методе если реализовывать рефреш логику

  • @InspireQuest-ru8pf
    @InspireQuest-ru8pf 9 місяців тому

    Спасибо за предоставленную информацию. У меня возник вопрос относительно класса AuthenticationManager. Я не понимаю, для чего он нужен, если в коде он нигде не используется, кроме как в качестве параметра для фильтра. Можете объяснить, зачем нужно передавать этот класс туда, если мы проверяем только токен клиента в фильтре, учитывая, что метод AuthenticationManager обращается к базе данных?

  • @alevadnaya
    @alevadnaya Рік тому

    Евгений, супер, спасиьо огромное! Несколько вопросов, если позволите.
    1. Сервис, где вы размещаете статьи, доступен под vpn? У меня из РФ не открываются ваши статьи.
    2. По проекту. Как с наименьшими усилиями прикрутить к проекту ui или swagger?
    3. Если использовать не postgres в качестве БД, а другую реляционную, не должно быть принципиальных изменений?

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +1

      Спасибо за отзыв!
      1. Да, под VPN доступен - ограничения провайдера
      2. Написать любой клиент под этот АПИ (ангуляр или реакт).

  • @zhaslanq
    @zhaslanq Рік тому

    Четко

  • @Mr.J248
    @Mr.J248 Рік тому +7

    Для того чтобы хорошо уметь тестировать авторизацию/регистрацию юзера , ее нужно написать ))) сегодня этим и займусь пожалуй )) спасибо Евгений )

  • @mendalau3515
    @mendalau3515 11 місяців тому

    А что такое секреты (secret), которые мы используем для кодирования пароля и генерации токена, и где их брать/генерировать, чтобы они были валидные. Спасибо большое за видео!

    • @EugeneSuleimanov
      @EugeneSuleimanov  11 місяців тому +1

      Зависит от формата, на этом сайте есть ряд форматов:
      randomkeygen.com/
      Спасибо за отзыв!

  • @divergenny
    @divergenny Рік тому +1

    А webflux и boot это разное получается ?) Или спринг секьюрити и там и там работает одинаково ?
    Просил вас видео про спринг буут и спринг секьюрити в новом формате показать, видео старое переделать )

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      Да, spring boot может не использовать реактивщину. Это просто удобный Фреймворк для быстрого старта приложения с рядом преимуществ.
      Концепция немного другая, если мы говорим про reactive, но суть та же.

  • @crazym8nd
    @crazym8nd 3 місяці тому

    Я делал по этому гайду приложение,сначала у меня не завелось, потому, что важно при использвоании lombok и mapstruct, чтобы зависимости ломбока стояли первыми

  • @andydrummer6310
    @andydrummer6310 6 місяців тому

    Спасибо за видео. Вопрос такой, можно в двух словах объяснить для чего здесь реактивность применена и вообще какой у нее практический смысл?

    • @EugeneSuleimanov
      @EugeneSuleimanov  6 місяців тому

      Спасибо за отзыв!
      Производительность и стиль разработки.

  • @slava_blin
    @slava_blin Рік тому

    Класс! Спасибо за видео, хорошо структурирует знания, а так же много нового и интересного подчерпнул. Есть кейс: хочу настроить securityWebFilterChain таким образом, чтобы все пути было открыты, а на один конкретный путь срабатывал фильтр. Я могу заменить publicRoutes на “/**” и где-то указать тот путь, который надо прогонять через фильтр?

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      Большое спасибо за отзыв!
      Да, должно отработать по документации.

  • @Az1zdev
    @Az1zdev Рік тому

    👍👍👍

  • @jollyroger2757
    @jollyroger2757 Рік тому +1

    Gradle мне кажется лучше поднимать обращаясь к объекту wrapper и в клоужер уже указать gradleVersion='8.0.1' .

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      Спасибо за комментарий!
      Да, конечно через задачу является рекомендуемой практикой, но ручной вариант описан в документации.
      docs.gradle.org/current/userguide/gradle_wrapper.html#:~:text=One%20way%20to%20upgrade%20the,in%20Adding%20the%20Gradle%20Wrapper.

    • @jollyroger2757
      @jollyroger2757 Рік тому

      ​@@EugeneSuleimanov забыл добавить - видео как всегда на высоте

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      @@jollyroger2757 спасибо :)

  • @user-og2ti2wd5o
    @user-og2ti2wd5o Рік тому +1

    Неймовірно😮

  • @grigorev.nikita
    @grigorev.nikita Рік тому

    Евгений, спасибо за такой контент на русском!

  • @kalivanich
    @kalivanich Рік тому

    Запустите курс по обучению, я полагаю будет очень востребованный от вашего авторства

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +1

      По моему опыту - все курсы заканчиваются одинаково - скатывание в «г#%#нокурсы» для заработка.
      Поэтому работаю только через менторинг.
      На данный момент, я не нашёл способа масштабирования без существенного падения качества, к сожалению.
      И спасибо за комментарий!

  • @user-nv6vn3ol9g
    @user-nv6vn3ol9g 10 місяців тому

    Большое спасибо за видео! Очень полезно! Подскажите пожалуйста, как запустить это приложение в docker-compose? Собрал бд в отдельном контейнере, все прописал, все запустилось, но не могу перейти ни по одному из эндпоинтов..

    • @EugeneSuleimanov
      @EugeneSuleimanov  10 місяців тому

      Спасибо за отзыв!
      Можете уточнить по ошибкам или логам контейнеров?

    • @user-nv6vn3ol9g
      @user-nv6vn3ol9g 10 місяців тому

      ​@@EugeneSuleimanov В логах ничего нет, пробовал дебажить, при обращении к эндпоинтам вообще не доходит до контроллера.. При всем этом тот же код, запущенный без контейнеров, с локальной бд работает без проблем.
      Postman выдает ошибку Error: connect ECONNREFUSED 127.0.0.1:8089.
      Из за того, что один и тот же код работает при локальном запуске и не работает в контейнерах, напрашивается вывод, что проблема во взаимодействии с этими контейнерами..
      Буду дальше копать, просто хотел уточнить, может быть такое, что к контейнеру сервиса закрыт доступ с внешних адресов? Или может быть есть особенности работы webflux, security, r2dbc, или netty в целом в контейнизированом приложении?

  • @ac130kz
    @ac130kz Рік тому

    Аннотация @Table как-то валидирует совместимость типов с базой хотя бы в рантайме? Со Spring не работал, просто как-то странно, в том же Django и SQLAlchemy, например, оно генерирует и управляется с SQL само

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      Генерация SQL происходит под капотом. Но если будет несовпадение со структурой данных или типами данных - вылетит исключение.

  • @user-wn8wl9ex3d
    @user-wn8wl9ex3d 6 місяців тому

    Экспирация)

    • @EugeneSuleimanov
      @EugeneSuleimanov  6 місяців тому

      Не подобрал сходу другого слова :)

  • @user-lt8vv5lk1w
    @user-lt8vv5lk1w Рік тому

    27:09 кстати, есть момент с yaml. При его использовании среда разработки не предлагает варианты во время набора ключа, при работе с property файлом такого нет. Может знаете как заставить идею так же работать с yaml?

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      Интересное наблюдение, попробую изучить вопрос. И спасибо за комментарий!

  • @OJIeLLlka
    @OJIeLLlka 11 місяців тому +1

    Подскажите плиз, почему во вложенном классе VerificationResults поля публичные, и мы к ним обращаемся без геттеров, напрямую? 56:25

    • @EugeneSuleimanov
      @EugeneSuleimanov  11 місяців тому

      Для удобства работы. Такой подход часто применяется для вложенных классов. Особенно на уровне DTO.

    • @OJIeLLlka
      @OJIeLLlka 11 місяців тому

      @@EugeneSuleimanov спасибо!

  • @daria3319
    @daria3319 Рік тому

    Евгений, здравствуйте! Скажите, пожалуйста, можно ли с реализацией Security, приведенной вами, использовать аннотацию @PreAuthorize("hasAnyRole('ADMIN')") для управления доступом к методам контролеров на основании роли пользователя?

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      Добрый день!
      Да, этот подход рабочий.

    • @user-fd6vx9yx2l
      @user-fd6vx9yx2l Рік тому

      @@EugeneSuleimanov Не работает с коробки(

  • @hitash5395
    @hitash5395 Рік тому

    Евгений, а вы не планируете сделать курс на юдеми часов на 20 с созданием какого-нибудь мини проекта на джаве и спринге? Я бы купил.

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +1

      Все курсы планирую делать публичными, бесплатными и на ютубе. По крайней мере, на данный момент :)

    • @hitash5395
      @hitash5395 Рік тому

      @@EugeneSuleimanov хорошо, буду ждать)

  • @alexandr6055
    @alexandr6055 8 місяців тому

    подскажите, откуда взялся секрет? Сказали, что его заранее подготовили и он валидный. Что это значит? Где его взяли и где валидировали?)

  • @maximelmanov6719
    @maximelmanov6719 Рік тому

    Спасибо за видео. Есть вопросы:
    Зачем были добавлены роли, если фактически они не используются?
    ИМХО, работу с генерацией, валидацией токена, думаю, лучше не разносить в отдельные классы(solid же).
    Не понял, зачем проверять токен своим велосипедом, если либа сама может это сделать?

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +1

      Спасибо за отзыв!
      1. По ролям - просто заготовка для расширения.
      2. Здесь есть несколько вариантов. Тот же S из SOLID здесь можно трактовать по-разному. Вряд ли будет однозначный ответ.

    • @maximelmanov6719
      @maximelmanov6719 Рік тому

      @@EugeneSuleimanov ещё третий вопрос. Проверить токен можно одной строкой

    • @maximelmanov6719
      @maximelmanov6719 Рік тому

      @@EugeneSuleimanov + как раз про второй вопрос. Из-за того что работа с токеном разнесена, в нескольких классах тащиться secret из пропертей

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      @@maximelmanov6719 конечно можно - это учебный пример - нужно показать более детально и понятно.

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      @@maximelmanov6719 в проперти не вижу проблемы, если есть аргументы - было бы отлично. Могу упускать детали.

  • @sardartatybaev9173
    @sardartatybaev9173 10 місяців тому

    Евгений можно использовать пример кода с security без реактившины?

    • @EugeneSuleimanov
      @EugeneSuleimanov  10 місяців тому

      Спасибо за комментарий!
      Нет, этот подход заточен под реактивщину.

  • @user-fd6vx9yx2l
    @user-fd6vx9yx2l Рік тому +1

    Подскажите, пожалуйста, как сюда прикрутить Role based control с аноташками по типу @PreAuthorized, или как-то по другому?
    Второй день мучаюсь(

    • @user-fd6vx9yx2l
      @user-fd6vx9yx2l Рік тому

      Помогите, плиз, хоть каким-то способом сюда Role based control внедрить

  • @front-endpadavan4421
    @front-endpadavan4421 4 місяці тому

    Немного не понял про перехват ошибок, можете пояснить зачем такой кастомный класс? Я использую @ControllerAdvice

    • @EugeneSuleimanov
      @EugeneSuleimanov  4 місяці тому

      Если я верно понял ваш вопрос, то с ним проще работать при создании гибкого механизма обработки. Например - свое DTO + получения деталей по ошибкам из БД по ключу.

  • @NameName-zg2kk
    @NameName-zg2kk Рік тому

    Спасибо за урок! Но у меня возник вопрос. Вот в yaml мы красиво пишем все эти секретные данные с паролями и ссылками на БД и генерации пароля для jwt, в Гит хаб пушается этот файл и тогда все те танци с конфигурациями идут на смарку, ведь файл будут видеть все кому не лень(только если репозиторий не приватный). Сам вопрос: в не учебном(комерционном) проекте yaml не пушается в гит? И еще на засипку, SECRET_KEY_INSTANCE по идее тоже должен быть в yaml, ведь класс Encoder 100% будет запушеным в гит.

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +1

      Спасибо за отзыв!
      Обычно, эти переменные передаются как переменные среды и подтягиваются на этапе запуска.

    • @densusanin4415
      @densusanin4415 Рік тому +1

      Общий смысл - создается локальная копия application.yml с кредами - application-local.yml, который "затирает" application.yml
      application-local.yml добавляем в .gitignore, теперь он не покидает локального репозитория и нужен только для локального тестирования
      Необходимые действия:
      1) создать копию application.yml - application-local.yml указать в новом файле креды
      2) Важно! - добавляем в .gitignore файл application-local.yml
      3) в application добавляем
      spring:
      config:
      import: optional:application-local.yml
      для локального тестирования используется application-local.yml
      указываем креды не боясь, что они утекут вместе с коммитом
      в import: optional:application-local.yml optional - указывает что это опциональный параметр, если такого файла нет, то используется application.yml

  • @ns9721
    @ns9721 9 місяців тому

    Подскажите пж где токен взять для авторизации в Postman?

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 місяців тому

      Создать самому через ендпоинт логина

  • @scheglov_danil
    @scheglov_danil Рік тому

    Здравствуйте, что за тема у вас в IDEA?

  • @Dimonchik_Limonchk
    @Dimonchik_Limonchk Рік тому

    У меня глупый вопрос как создать POSTGRES-LOCAL? Через DG idea? Или что-то другое, я этого никогда не делал. Не понимаю как быть.

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      www.jetbrains.com/help/datagrip/postgresql.html
      Здесь есть делателе описание.

    • @Dimonchik_Limonchk
      @Dimonchik_Limonchk Рік тому

      @@EugeneSuleimanov Сделал так: удалил все, скачал заново, установил драйвер нажал test connection ([08004] The server requested SCRAM-based authentication, but no password was provided.) ввел пароль. [28P01] �����: ������������ "dkloc" �� ������ �������� ����������� (�� ������). пришло такое.

  • @TomHardy-shorts
    @TomHardy-shorts 8 місяців тому

    Правильно ли я понимаю, что многое вырезали в новой spring security?

    • @EugeneSuleimanov
      @EugeneSuleimanov  8 місяців тому

      Спасибо за вопрос.
      Я бы сказал, что заменили.

    • @TomHardy-shorts
      @TomHardy-shorts 8 місяців тому

      Да, скорее так. От того и вопросы появились при
      создании SecurityWebFilterChain))@@EugeneSuleimanov

  • @user-rj4lb2go8r
    @user-rj4lb2go8r Рік тому +1

    У entity зря не переопредели equals и hashCode.

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +2

      Если я верно вас понял, то аннотация Data включает в себя:
      @ToString, @EqualsAndHashCode, @RequiredArgsConstructorи @Getter + @Setter для всех не финальных полей.

    • @erkin7138
      @erkin7138 Рік тому

      у Евгения Lombok, @Data включает переопределение методов для классов энтитей

    • @user-up2lc4kb5o
      @user-up2lc4kb5o Рік тому +1

      @@erkin7138 , та же JpaBuddy не рекомендует использовать аннотацию @Data в Entity. Если схема БД чуть сложнее и в Entity присутствуют "ленивые" поля, то ломбоковское видение методов toString, equals, hashCode может привести к ухудшению производительности приложения в связи с появлением множественных запросов к БД.

  • @anthonya880
    @anthonya880 Рік тому

    Is Spring Webflux gaining popularity ?

  • @user-xg6so1kq3z
    @user-xg6so1kq3z 9 місяців тому

    +

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 місяців тому

      Как всегда, спасибо за поддержку!

  • @user-mf6uc9iw2z
    @user-mf6uc9iw2z Рік тому

    Чтото смотрю не спешат интегрировать hibernate reactive в спринг

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      Да, вы правы, не встречал такого еще.

  • @MrArksu
    @MrArksu Рік тому

    почему не kotlin в 2023 году?

  • @user-vvvm
    @user-vvvm 10 місяців тому

    Курс мне понравился. Я попробовал его реализовать в netbeans 15 (maven). При вводе регистрационных данных, postman выдает An expected CSRF token cannot be found при 403 ошибке. Не могли бы вы подсказать в чем дело ? В секюрити конфиге .csrf().disable(). Заранее благодарен.

    • @EugeneSuleimanov
      @EugeneSuleimanov  10 місяців тому

      Сложно сказать, скорее всего ошибка в коде, а не в IDE или Maven.
      И спасибо за комментарий!

    • @user-vvvm
      @user-vvvm 10 місяців тому

      Спасибо за ответ, на этот раз все получилось, причина была в том , что секюрити конфиг у меня был отдельным пакетом на одном левеле с проектом.

    • @EugeneSuleimanov
      @EugeneSuleimanov  10 місяців тому

      @@user-vvvm рад, что все получилось!

  • @ruslanzubkov4297
    @ruslanzubkov4297 Рік тому

    При клонировании и запуске проекта получаю сразу ошибку. Тем не менее спасибо за урок.
    Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1770
    Caused by: org.flywaydb.core.internal.exception.FlywaySqlException at JdbcUtils.java:60
    Caused by: org.postgresql.util.PSQLException at ConnectionFactoryImpl.java:844

    • @adeskmath
      @adeskmath Рік тому

      тоже застрял на этом моменте на ~ 15 минуте :), делал ручками как в видео
      из сообщений в консоли - что-то не так c авторизацией flyway, в итоге дописал user и password:
      flyway:
      url: jdbc:postgresql://localhost:5432/webflux_security
      locations: classpath:db/migration
      password: xxxxxx
      user: postgres
      после чего заработало и таблица в БД создалась,
      пока нет времени посмотреть дальше, может там будет объяснение (выше указ.проблемы),
      если нет - просьба экспертов подсказать, в чем причина и как ее решать (без дублирования как я сделал)
      Автору - спасибо большое, таких тем еще не видел + понятным языком. респект.

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      Проверьте, что Postgres запущен если да - проверьте, что БД создана и креды корректны.

    • @adeskmath
      @adeskmath Рік тому +1

      @@EugeneSuleimanov Postges был запущен, БД создана, а что такое "креды"?
      как указал ранее, сработало при добавлении 2х последних строк ниже:
      spring:
      r2dbc:
      url: r2dbc:pool:postgres://localhost:5432/webflux_security
      username: postgres
      password: xxxxxxx
      flyway:
      url: jdbc:postgresql://localhost:5432/webflux_security
      locations: classpath:db/migration
      password: xxxxxxx
      user: postgres

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      @@adeskmath должно отработать и без них, перепроверю, спасибо!

  • @raynur256
    @raynur256 Рік тому

    Какие-то проблемы у меня со сборкой с этим flyway
    contextLoads() FAILED
    java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:142
    Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1770
    Caused by: org.flywaydb.core.internal.exception.FlywaySqlException at JdbcUtils.java:60
    Caused by: org.postgresql.util.PSQLException at QueryExecutorImpl.java:2713

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      Вы можете проверить, что БД создана и username + password корректны?

    • @raynur256
      @raynur256 Рік тому

      @@EugeneSuleimanov проверил это подключением с идеи

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      @@raynur256 попробуйте подтянуть свежую версию проекта - внёс небольшую правку.

    • @raynur256
      @raynur256 Рік тому

      @@EugeneSuleimanov Сработало, спасибо. Стоило догадаться, но я так и не понимаю как у вас без этого получилось

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому

      @@raynur256 сам в недоумении ))

  • @anonim00723
    @anonim00723 Рік тому

    Добрый день возникли такие ошибки не знаю как исправить
    org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1770
    org.flywaydb.core.internal.exception.FlywaySqlException at JdbcUtils.java:60
    org.postgresql.util.PSQLException at ConnectionFactoryImpl.java:693
    There were failing tests. See the report at: file:///home/erin/IdeaProjects/webfluxsecurity/build/reports/tests/test/index.html
    буду рад любому ответу спасибо !

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +1

      Добрый день!
      Подтяните свежую версию проекта - внёс небольшую правку.

    • @anonim00723
      @anonim00723 Рік тому

      @@EugeneSuleimanov Спасибо !

  • @user-xg6so1kq3z
    @user-xg6so1kq3z Рік тому

    +

    • @EugeneSuleimanov
      @EugeneSuleimanov  Рік тому +1

      Спасибо за комментарий!

    • @user-xg6so1kq3z
      @user-xg6so1kq3z Рік тому

      @@EugeneSuleimanov это вам благодарность!!!!!!!!!!!!