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

แชร์
ฝัง
  • เผยแพร่เมื่อ 5 ก.ย. 2024
  • Ссылка на репозиторий с исходным кодом проекта:
    github.com/pro...
    Ссылка на документацию Spring Security:
    docs.spring.io...
    CSRF:
    ru.wikipedia.o...
    habr.com/ru/po...
    В данном видео создано REST API с использованием Spring Security. Аутентификация и авторизация реализованы с использованием JWT токена.
    Технологии:
    Java, Spring (IoC, Web, Data, Security), MySQL, Lombok, JsonWebToken, Liquibase, Git.

ความคิดเห็น • 415

  • @user-jt5ds8fo6r
    @user-jt5ds8fo6r 4 ปีที่แล้ว +36

    Прелесть данного туториала в том, что он не слишком сложный и не слишком простой.
    То есть, это не банальный 'hello world', который не понятно как применять в реальном проекте.
    Также это не перегруженный проект в котором сложно разобраться.
    Золотая середина!
    Очень классно рассказал о Spring Security. Какие компоненты за что отвечают. Наконец-то стало ясно как оно работает и как настраивать.
    П.с. Надеюсь ты уже улучшил свои скилы работы с Optional.

  • @egorvakulenko6198
    @egorvakulenko6198 4 ปีที่แล้ว +15

    Очень полезное видео! Спасибо! Еще и тему DTO зацепил - вообще Красавчик!

    • @EugeneSuleimanov
      @EugeneSuleimanov  3 ปีที่แล้ว

      Спасибо за отзыв!

    • @VladimirDubenco
      @VladimirDubenco 3 ปีที่แล้ว

      А еще и показал как правильно аннотировать BaseEntity !

  • @user-iu6yz6ck6h
    @user-iu6yz6ck6h 5 ปีที่แล้ว +10

    Спасибо за видео. Не пропадайте, очень интересно!

    • @EugeneSuleimanov
      @EugeneSuleimanov  5 ปีที่แล้ว +6

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

    • @k0jihero
      @k0jihero 3 ปีที่แล้ว

      @@EugeneSuleimanov Евгений, снимите туториал по микросервисам)

  • @arturbarkou6347
    @arturbarkou6347 4 ปีที่แล้ว +6

    Все работает, спасибо больше за видео. Было бы круто добавить походу больше пояснений про внутреннее устройство spring security и почему сделано так а не иначе вместо надиктовывания строчек кода.

    • @EugeneSuleimanov
      @EugeneSuleimanov  3 ปีที่แล้ว +1

      Спасибо за отзыв!
      По поводу более глубокого объяснения - здесь мне будет крайне сложно превзойти документацию, изучение которой я крайне рекомендую.
      docs.spring.io/spring-security/site/docs/current/reference/html5/
      Цель видео - дать самое базовое представление и практический навык работы с технологией.

  • @user-lx3ul3ix1t
    @user-lx3ul3ix1t 4 ปีที่แล้ว +5

    Очень крутое видео! Спасибо. Единственное полное видео по этой теме, которое смог найти.

  • @alexhali6003
    @alexhali6003 3 ปีที่แล้ว +1

    Все отлично, есть несколько пожеланий:
    1. Autowired над конструктором можно не вешать, т.к. других конструкторов нет и при создании бина Spring сам поймет что инжектить.
    2. Аннотация @AllArgsConstructor, как уже писали - сильно поможет.
    3. В имплементации UserDetails сильно нужны @AllArgsConstructor и @Data, т.к. отвлекает генерация геттеров\сеттеров.
    4. Публичный конструктор без параметров в фабрике не нужен, javac сам подсунет если не найдет.
    5. Было бы неплохо добавить вариант ограничения доступа через аннотации, типа @RolesAllowed/@Secured

  • @elnar_1206
    @elnar_1206 2 หลายเดือนก่อน

    Спасибо за отличный урок🔥🔥🔥

    • @EugeneSuleimanov
      @EugeneSuleimanov  2 หลายเดือนก่อน

      Спасибо за отзыв!

  • @user-zl9bb7po6b
    @user-zl9bb7po6b 4 ปีที่แล้ว +2

    Большущее тебе спасибо, бро! Доходчиво, понятно, супер. Очень сильно жизнь облегчило, как раз пишу дипломный по курсах...

  • @user-mz4xd3dp1c
    @user-mz4xd3dp1c 2 ปีที่แล้ว +1

    Спасибо большое! Не смотря на длительность было очень интересно смотреть)

  • @ShulV
    @ShulV ปีที่แล้ว

    Не слишком сложно и не слишком легко. То, что нужно!

  • @user-yn8zr4xv4m
    @user-yn8zr4xv4m 5 ปีที่แล้ว +3

    Спасибо, не пропадайте больше!)

    • @EugeneSuleimanov
      @EugeneSuleimanov  5 ปีที่แล้ว +4

      Спасибоза отзыв. Постараюсь )

  • @eugenevolohonsky1469
    @eugenevolohonsky1469 ปีที่แล้ว +1

    Нашел хорошее видео на ту же тематику, но уши кровоточат от чудовищного каверканья английских терминов. Как же приятно слушать Евгения

  • @olexandr_kiss
    @olexandr_kiss 4 ปีที่แล้ว +1

    Не мог не отписать. Очень грамотно сделано и подано. Спасибо.

  • @overlordofprogramminglangu7822
    @overlordofprogramminglangu7822 4 ปีที่แล้ว +1

    Спасибо большое за объяснение столь важной темы)

  • @axelrod4840
    @axelrod4840 4 ปีที่แล้ว +33

    Евгений, спасибо за видео урок. Как можно реализовать refresh token на базе этого rest api?? буду очень благодарен

    • @johnmarrewood
      @johnmarrewood 2 ปีที่แล้ว +1

      Похоже ответа не будет(

  • @jakhara4202
    @jakhara4202 3 ปีที่แล้ว

    Спасибо вам большое за ваш труд. Лучшей материал на TH-cam по этой теме СУПЕР.

  • @user-hb8gv3cu1l
    @user-hb8gv3cu1l 4 ปีที่แล้ว +2

    Отлично объясняешь, видео очень помогло, большое человеческое тебе, друг)

    • @EugeneSuleimanov
      @EugeneSuleimanov  3 ปีที่แล้ว

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

  • @4val0v
    @4val0v 5 ปีที่แล้ว

    Евгений, у вас лучшие ролики, доходчиво и без воды, жаль что видео приходится ждать месяцами :(
    Также мне очень хотелось бы увидеть продолжение данного ролика с использованием mapstruct

    • @EugeneSuleimanov
      @EugeneSuleimanov  5 ปีที่แล้ว +4

      Спасибо за отзыв, Андрей. Постараюсь выложить вторую часть в течение нескольких недель (обновление токена, регистрация и т.д.)

    • @4val0v
      @4val0v 5 ปีที่แล้ว

      @@EugeneSuleimanov Это хорошие новости, будем ждать, спасибо большое

  • @user-iu6yz6ck6h
    @user-iu6yz6ck6h 4 ปีที่แล้ว +1

    Очень классное виде! Очень жаль, что таких больше не выпускаете

  • @sergios7777
    @sergios7777 2 ปีที่แล้ว

    Все хорошо, конечно, слов нет, большое спасибо! Но было бы совсем замечательно, если бы Евгений каждый момент, который он называет "ну, тут все понятно", хотя бы в двух словах пояснял. Потому что, если я пришел смотреть такое длинное видео, значит я просто не знаю, как в принципе реализовать Security на Spring с JWT. Приходится гуглить все не пояснённые моменты типа что такое grantedauthority и simplegrantedauthority и еще несколько вещей. А тем кому все эти моменты понятны, он точно не будет тратить 1,5 часа на видео. Я ничего против сказать не хочу, абсолютно весь материл Евгения просто бестселлер, браво! Поэтому когда я искал в youtube как реализовать Spring Security with JWT и увидел Евгения, с радостью начал смотреть, так как уже знаком с высоким профессионализмом этого замечательного человека и программиста, а данный комментарий -- просто рекомендация.

    • @EugeneSuleimanov
      @EugeneSuleimanov  2 ปีที่แล้ว +1

      Спасибо за отзыв, Сергей! На канале есть более подробное видео по основам Spring Security:
      th-cam.com/video/7uxROJ1nduk/w-d-xo.html
      Надеюсь, оно будет более полезно. И спасибо за рекомендацию.

    • @sergios7777
      @sergios7777 2 ปีที่แล้ว

      @@EugeneSuleimanov Огромное спасибо, завтра займусь изучением!

  • @valeralemberov2853
    @valeralemberov2853 2 ปีที่แล้ว +1

    Очень круто. Ты красава!!!!

  • @alexpodshivalov1010
    @alexpodshivalov1010 3 ปีที่แล้ว +4

    Превосходное видео и объяснения. Было бы здорово для полноты катрины добавить регистрацию пользователя в этом же проекте. Если есть такое видео, то поделитесь пожалуйста ссылкой

  • @ErikGhukasyan
    @ErikGhukasyan 4 ปีที่แล้ว

    Спасибо большое за видеоурок. Он мне очень помог. Не пропадайте ;)

    • @EugeneSuleimanov
      @EugeneSuleimanov  4 ปีที่แล้ว +1

      Спасибо за отзыв! Постараюсь)

  • @user-wx4rs8ju3h
    @user-wx4rs8ju3h 11 หลายเดือนก่อน

    Отличный выпуск) спасибо за ваш труд)

    • @EugeneSuleimanov
      @EugeneSuleimanov  11 หลายเดือนก่อน

      Спасибо за отзыв!

    • @EugeneSuleimanov
      @EugeneSuleimanov  11 หลายเดือนก่อน

      Спасибо за отзыв!

  • @sear5126
    @sear5126 ปีที่แล้ว +1

    Рекомендую вам в дальнейшем использовать Lombok, удобная тула для того чтобы избавиться от явной прописи конструкторов геттеров и сеттеров (если вкратце)

  • @antontevs
    @antontevs 4 ปีที่แล้ว +3

    Субъективно, Flyway по удобней будет для миграции, и понятный sql, а не xml.

  • @odilbekrahmonov1584
    @odilbekrahmonov1584 3 ปีที่แล้ว

    Спасибо за урок мне очень понравилось

  • @veli2698
    @veli2698 4 ปีที่แล้ว +5

    Подскажите, почему не используете DI для JwtTokenFilter и JwtTokenProvider, а создаете их вручную? Можно ли так же аннотировать эти классы через @Component и заменить все new на инжект через DI?

  • @user-wq5nx4lr5l
    @user-wq5nx4lr5l 4 ปีที่แล้ว +1

    Спасибо большое! Сделайте, пожалуйста, курс по микросервисам, докеру)

    • @EugeneSuleimanov
      @EugeneSuleimanov  4 ปีที่แล้ว +8

      Это соль на рану. Уже крайне давно хочу записать серию подобных видео, но не хватает времени, к сожалению... ((
      Крайне надеюсь, что в этом году получится. Спасибо.

    • @user-wq5nx4lr5l
      @user-wq5nx4lr5l 4 ปีที่แล้ว

      @@EugeneSuleimanov Удачи!

  • @tobikron
    @tobikron 2 ปีที่แล้ว

    32:35 Хорошо)
    мой перфекционист в душе: ну что же тут хорошего, где передаваемый параметр? 😁

  • @petrovandrey9735
    @petrovandrey9735 ปีที่แล้ว

    Евгений, спасибо огромное за Ваш труд! Спустя годы контент все равно остается полезным и актуальным!
    Проясните пожалуйста несколько вопросов по видео:
    1) 38:58 А зачем все-таки этому классу пустой конструктор по умолчанию? И можно здесь же пояснить зачем именно сделали класс final (т.е. в чем будет проблема если он будет не final)?
    2) 42:15 почему User.roles нужно копировать в new ArrayList перед конвертацией в GrantedAuthorities (строка 26)?
    3) 57:12 Зачем переопределять метод authenticationManagerBean ничего не меняя по сути в имплементации, а только вызывая super (т.е. он и без этого будет создан спрингом и вести будет себя точно так же)?

    • @engend3405
      @engend3405 ปีที่แล้ว +3

      Привет.
      1) Видео сделано давно , есть неточности и чтобы их поправить , придется повозиться.
      2) По пункту 1, 2 согласен.
      3) Возможно, при создании своей аутентификации , ты обязан явно внедрить бин
      AuthenticationManager в AuthenticationRestControllerV1, поэтому в конфигурационном классе его как раз и создаешь (без всяких super. и само собой не переопределяя , хотя раньше нужно было).
      * В целом крутой материал , как всегда - спасибо)

    • @lehatalant9878
      @lehatalant9878 ปีที่แล้ว

      Прошло уже какое-то время, но могу ответить на второй пункт. Копирование делается на тот случай, если мы роли храним не в List, а в Set. Недавно столкнулся с этим пока практиковался и теперь запомню на долго)

    • @petrovandrey9735
      @petrovandrey9735 ปีที่แล้ว

      @@lehatalant9878 поясни плиз в чем именно может быть проблема даже если где-то Set будет?

    • @lehatalant9878
      @lehatalant9878 ปีที่แล้ว +1

      @@petrovandrey9735, Spring Security работает только с List и если мы вставим Set, тогда появится ошибка.

    • @petrovandrey9735
      @petrovandrey9735 ปีที่แล้ว +1

      Понял, спасибо!

  • @engend3405
    @engend3405 ปีที่แล้ว

    Спасибо , как всегда круто)

  • @PP-hn9vq
    @PP-hn9vq 2 ปีที่แล้ว

    спасибо за шикарный видос) даже код есть, мечта))) чуть бы код покрупнее.

  • @roebinin
    @roebinin ปีที่แล้ว +2

    @50:14 Очень понравился материал. Однако, не разумнее затолкать инициализацию бина passwordEncoder в корень конфигурации проекта, а не в отдельном (пусть и магистральном) компоненте JwtTokenProvider?

    • @ALexus6192
      @ALexus6192 ปีที่แล้ว

      У меня вообще ошибка выпадает, что не может найти такой бин

  • @iesoveev
    @iesoveev ปีที่แล้ว

    Механизм JWT буквально кричит о том, что не нужно ходить в базу при каждом запросе на сервер. Он хранит информацию о пользователе в самом себе. ..........

  • @alexpodshivalov1010
    @alexpodshivalov1010 3 ปีที่แล้ว +1

    Очень долго пытался разбраться почему не работает jwtTokenProvider так и не смог. Постоянно получаю различные исключения при разных ситуациях. Так и не могу ни как заставить его работать

  • @iorgankrat1118
    @iorgankrat1118 3 ปีที่แล้ว

    спасибо вам, очень круто

  • @user-oj5gu2kb1k
    @user-oj5gu2kb1k 4 ปีที่แล้ว +5

    Как это все сделать с решрештокеном?

  • @eugenevolohonsky1469
    @eugenevolohonsky1469 ปีที่แล้ว +1

    Попробовал сделать такую же авторизацию на тестовом проекте и столкнулся с тем, что отсутствует WebSecurityConfigurerAdapter. В последних версиях Spring Security его нет. Целый день пытаюсь адаптировать пример из видео под использование без адаптера. Будет ли подобное видео с новой версией секьюрити или разбор что изменилось и как теперь с этим работать?

    • @EugeneSuleimanov
      @EugeneSuleimanov  ปีที่แล้ว +1

      @Configuration
      @EnableWebSecurity
      public class SecurityConfig {
      @Autowired
      private JwtAuthenticationFilter jwtAuthenticationFilter;
      @Autowired
      private CustomUserDetailsService customUserDetailsService;
      @Bean
      public PasswordEncoder passwordEncoder() {
      return new BCryptPasswordEncoder();
      }
      @Autowired
      public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
      auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder());
      }
      @Bean
      public JwtAuthenticationFilter jwtAuthenticationFilter() {
      return new JwtAuthenticationFilter();
      }
      @Bean
      public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
      http.csrf().disable()
      .authorizeRequests()
      .antMatchers("/api/auth/**").permitAll()
      .antMatchers("/api/**").authenticated()
      .and()
      .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
      return http.build();
      }
      }
      Это примерно. Т.е. используются аннотации и SecurityFilterChain. Это должно помочь.

    • @eugenevolohonsky1469
      @eugenevolohonsky1469 ปีที่แล้ว +1

      @@EugeneSuleimanov спасибо!

  • @Chron4ik
    @Chron4ik 3 ปีที่แล้ว

    Шикарный видос!

  • @xz8928
    @xz8928 ปีที่แล้ว +1

    А зачем вручную создавать таблицы,если jpa автоматически создаст их?

  • @ololo2274
    @ololo2274 4 ปีที่แล้ว +2

    Здравствуйте ) А как интегрировать liquibase в Spring MVC, чтобы при запуске приложения создавались таблицы в БД? Я пытаюсь сконфигурировать плагин со всеми настройками и там указать путь к файлу changelog.xml. Но таблицы не создаются.

  • @turkmenperson681
    @turkmenperson681 4 ปีที่แล้ว

    Спасибо за Урок, лучшая объяснения)) Вопрос, можешь снимать урок где добавляешь возможность logout и remember me???)

  • @user-sq6kg8pj4w
    @user-sq6kg8pj4w 3 ปีที่แล้ว +2

    @
    Eugene Suleimanov Огромное спасибо за данный урок! Подскажите каким образом можно токен сделать недействительным, выполнив logout. Как я понял можно создать сущность "чёрный список" для JWT токенов, но как правильно реализовать до меня не доходит. Или для этого и существует Auth 2.0 и работа с ним? Накиньте пожалуйста мыслей!

  • @user-jj2eu6yx6r
    @user-jj2eu6yx6r 2 ปีที่แล้ว +1

    Спасибо! Но , сложновато , конечно ... долго писали базу и модель , в итоге , что касается security , видимо, автор подустал и пошла спешка

  • @hrachkhachatryan3006
    @hrachkhachatryan3006 4 ปีที่แล้ว

    zdrastvuy uvajaemi Eugene , spasibo bolshoe chto delishsya svoim opitom i znaniem s nami) prosto malenkaya prosba k tebe, font size nemnojko uvelichivay

  • @Shikarno_3000
    @Shikarno_3000 ปีที่แล้ว

    Ролики супер, огромное спасибо, но запускайте свои проекты пожалуйста перед Push'ем на гит , а то со скаченного проекта с гитхаба выходит карусель при создании бинов, я конечно ее решил, и тем самым понял ваш урок еще лучше, может быть вы так и планировали ?)))

    • @EugeneSuleimanov
      @EugeneSuleimanov  ปีที่แล้ว

      Заливал довольно давно и на тех версиях и в той конфигурации, насколько я помню, это работало. Если нет, то прошу прощения за неудобства.
      P.S.: если там ошибка, то это мой фол, а не хитрый план :)

  • @FoxChpoks
    @FoxChpoks 2 ปีที่แล้ว

    При отсутствии в заголовке токена необходимо возвращать 401 Unauthorized, а не 403 Forbidden. В данной имплементации, к сожалению, всегда 403.

  • @qweezique
    @qweezique 2 ปีที่แล้ว

    Большое спасибо!

  • @aoveden197727
    @aoveden197727 3 ปีที่แล้ว

    Евгений, уроки отличные. Но надо сделать хороший звук (здесь он глухой и не заднем плане где-то) и картинку с кодом крупнее.

    • @EugeneSuleimanov
      @EugeneSuleimanov  3 ปีที่แล้ว +1

      Спасибо, да,есть проблем, стараюсь исправить в новых видео.

    • @aoveden197727
      @aoveden197727 3 ปีที่แล้ว

      @@EugeneSuleimanov где можно вам задать вопросы по этому проекту? На первом же запуске, когда ещё БД пустая, выдаёт ошибку. Дальше писать не рабочее приложение не интересно. Есть какой-нибудь оперативный вариант связи с вами?

  • @aojona
    @aojona ปีที่แล้ว

    В данной реализации при каждом обращении пользователя фильтр JwtTokenFilter через jwtTokenProvider обращается к базе данных, и тем самым, сводит преимущества JWT токенов на нет. Чтобы это исправить, нужно переписать метод getAuthentication так, чтобы он собирал объект Authentication на основе тех данных, которые есть в самом токене (Claims). Поправьте меня, если ошибаюсь. А так большое спасибо за Ваш видео урок!

    • @EugeneSuleimanov
      @EugeneSuleimanov  ปีที่แล้ว +1

      Спасибо за комментарий!
      Да, вы правы, мы могли бы сделать и так. Здесь единственное преимущество в том, что изменение статуса мгновенно отразится на аутентификации.

  • @yaqubaliyev8245
    @yaqubaliyev8245 ปีที่แล้ว

    "toor" Молодец Женя😁

  • @user-gc8py3zp3q
    @user-gc8py3zp3q 4 ปีที่แล้ว +2

    Добрый день! Как отправить POST запрос для создания нового пользователя и сохранения его в базе, если еще никакой пользователь не авторизован?

  • @user-uq4nd6go9c
    @user-uq4nd6go9c 4 ปีที่แล้ว +1

    Круто.

  • @sergiisavin5633
    @sergiisavin5633 5 ปีที่แล้ว +1

    very good tutorial!

    • @EugeneSuleimanov
      @EugeneSuleimanov  5 ปีที่แล้ว

      Спасибо за отзыв, Сергей.

  • @user-sj9kh4pf7n
    @user-sj9kh4pf7n 5 ปีที่แล้ว

    С возвращением!)

  • @volandio
    @volandio 5 ปีที่แล้ว

    Лайк ещё до просмотра)

  • @GoPetr
    @GoPetr 5 ปีที่แล้ว +2

    Спасибо Вам! В ру сегменте очень не хватает качественных уроков!
    Будет ли ещё видео, так как от Вас год ждал видео))

    • @EugeneSuleimanov
      @EugeneSuleimanov  5 ปีที่แล้ว

      Спасибо за отзыв, Александр ) Постараюсь выкладывать чаще. Сейчас работаю над серией видео по Java 11. Но, основная работа занимает много времени. Постараюсь к середине лета добить Java 11 и выложить.

    • @GoPetr
      @GoPetr 5 ปีที่แล้ว +3

      @@EugeneSuleimanov лучше spring. Все же большинство людей смотрят, что бы устроиться на работу. Посмотрите на сегмент хибернейта, спринга. Его практически нет. Мало кто хороше рассказывает. И критически мало видео где создают свое веб приложение. Я знаю только ОДНОГО автора который создаёт свое приложение, но все же не совсем для новичков. Не разжёвывает. Вот у вас выходит ещё. Но и все.

    • @EugeneSuleimanov
      @EugeneSuleimanov  5 ปีที่แล้ว +4

      @@GoPetr как вариант. Spring 5 есть заготовки, возможно, переключусь на этот цикл видео. Спасибо за совет

    • @GoPetr
      @GoPetr 5 ปีที่แล้ว

      @@EugeneSuleimanov было бы круто! Спасибо!

    • @4val0v
      @4val0v 5 ปีที่แล้ว +4

      @@EugeneSuleimanov Также за Spring Boot, по Java 11 другие блогеры расскажут, а вот второго Евгения нету на TH-cam который также круто будет по spring учить ;)

  • @alexandarv.2688
    @alexandarv.2688 5 ปีที่แล้ว +27

    Сделай пожалуйста еще видео о создании фронтенда на реакте для этого проекта.

    • @ram0973
      @ram0973 3 ปีที่แล้ว

      лучше на ангуляре :)

    • @BigBigLeo
      @BigBigLeo 3 ปีที่แล้ว

      @@ram0973 нет, на реакте лучше)

    • @ram0973
      @ram0973 3 ปีที่แล้ว

      @@BigBigLeo обычно на C#\Java проекты на ангуляре 😉

    • @BigBigLeo
      @BigBigLeo 3 ปีที่แล้ว

      @@ram0973 Да, это было так, пока Angular не устарел :D

    • @ram0973
      @ram0973 3 ปีที่แล้ว

      @@BigBigLeo оО а он уже устарел?

  • @Flawden
    @Flawden ปีที่แล้ว

    Офигенно

    • @EugeneSuleimanov
      @EugeneSuleimanov  ปีที่แล้ว

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

  • @budha_rain
    @budha_rain ปีที่แล้ว

    Спасибо

  • @alexsnowden7077
    @alexsnowden7077 5 ปีที่แล้ว

    Евгений спасибо большое за ваши видео. В них всегда можно чему то научиться. Такой вопрос: у вас есть опыт работы с чем то реактивным spring web flux или просто rxjava? Было бы супер увидеть от вас видео на такую тему.

    • @EugeneSuleimanov
      @EugeneSuleimanov  5 ปีที่แล้ว +1

      Спасибо за отзыв, Alex.Да, конечно. Я подумаю, что можно сделать на эту тему.

  • @lance9533
    @lance9533 ปีที่แล้ว

    Может на спринг буте 2.1.4 это работает, но я встретился с проблемой циклической зависимости, исправил за счет того что вынес бин passwordEncoder в отдельный конфиг класс

  • @valeriyemelyanov9090
    @valeriyemelyanov9090 4 ปีที่แล้ว +2

    Прохожу аутентификацию, получаю токен. У get запроса в header "Authorization" помещаю Bearer_токен. Посылаю запрос. Получаю ответ 403 Forbidden. Как искать ошибку? По точкам останова никуда не попадаю.

    • @user-sd1sy4uk8o
      @user-sd1sy4uk8o 4 ปีที่แล้ว

      Решили? Та же проблема сейчас) Если решили, отпишитесь плз

    • @valeriyemelyanov9090
      @valeriyemelyanov9090 4 ปีที่แล้ว

      @@user-sd1sy4uk8o Решил, не помню точно что было. Что то тривиальное, неправильно набрал текст (не тот класс, не тот метод, ...). Нашел чисто визуально через некоторое время. Вопрос как это отловить отладкой остался.

    • @user-sd1sy4uk8o
      @user-sd1sy4uk8o 4 ปีที่แล้ว

      @@valeriyemelyanov9090 роли должны быть не ADMIN а ROLE_ADMIN)
      И всё)

  • @user-hq6nm2tf6j
    @user-hq6nm2tf6j 4 ปีที่แล้ว +2

    если уже используешь ломбок, то можно юзать аннотации @RequiredArgsConstructor, чтобы не писать конструктор

    • @user-zv7wi7kf4i
      @user-zv7wi7kf4i 4 ปีที่แล้ว +1

      может, ради Autowired

  • @user-oj5gu2kb1k
    @user-oj5gu2kb1k 4 ปีที่แล้ว

    Что-бы юзеру фабрику не городить можно в userDetailIml просто положить полем appUser и с него уже выдать все поля геттерами

  • @Alex-qy9zm
    @Alex-qy9zm 4 ปีที่แล้ว

    Четко!

  • @user-qr6nm9mj2s
    @user-qr6nm9mj2s ปีที่แล้ว

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

    • @EugeneSuleimanov
      @EugeneSuleimanov  ปีที่แล้ว

      Спасибо за отзыв!
      Через глобальный обработчик ошибок.

  • @Shikarno_3000
    @Shikarno_3000 ปีที่แล้ว

    Добрый день, Евгений, все больше углубляюсь в понимание Spring Security, и почитав много документации и разобрав Ваш пример, у меня возник вопрос:
    Исхожу из посыла, что токен придуман для общения между серверами, чем между пользователями и сервером, чтобы постоянно не брать аутентификацию из сесии ,а там из контекста. и как я понял фронт может обойтись без файлов куки.
    Тем самым токен позволяет не использовать сессии и как я понял использовать аутентификацию только 1 раз если у пользователя нету токена, чтобы его выдать, а в дальнейшем только проверять токен и тем самым ускорять работу.
    Само собой, если кто-то украдет токен, и без лишней проверки на аутентификацию, то будет серверу плохо.
    Но все же,
    1. Вопрос.
    Почему в классе JwtTokenFilter в методе doFilter вы проверяете токен , и если с токеном все хорошо, вы создаете аутентификацию, опять проверяя существует ли юзер в базе данных? но прибегая к обычному UserDetails , если вы используете до этого JwtUser который имплементирует userdetails.Возможно в JwtTokenProvider должен был инжектиться не UserDetailsService, а JwtUserDetailsService?
    2. Вопрос
    Вместо проверки Аутентификации в сесии, мы в том же методете ее устанавливаем каждый раз после проверки токена. Зачем мы это делаем если с токеном все впорядке? почему мы не может пропустить данный пункт(если это еще один пособ проверки, то вопрос исчерпан), и там же мы проводим проверку на null, как аутентификация может быть null, если валидный токен к нам пришел ?
    3. Вопрос
    В контольлере , /login Вы проводите аутентификацию с помощью AuthenficationManager, и если она проходит, то соответственно Вы выдаете токен. Насколько я понял аутентификация происходит автоматически, в остальных методах вы проверку не проводите в ручную, а так же вы не проводите проверку токена, это мне тоже совсем не понятно. Я понял что вы добавили новый фильтр перед аентентификацией, но как его пройти, если токена нету ?
    Фильтр первый увидел токена нету, включает следующий UsernamePasswordAuthenticationFilter ?
    Меня не покидает ощущение что нужно было заоверайдить AuthMeneger на новый провайдер, который связан с JwtTokenProvider и JwtUserDetailsService, или нельзя базовую аентентификацию переписывать на JWTToken? поясните этот момент, пожалуйста.
    Извините, если плохо изложил свои мысли, но данные моменты не дают покоя моей голове, если я что-то не правильно понял о процессе security, разъясните пожалуйста, или дайте ссылку на понимания данного момента.

    • @EugeneSuleimanov
      @EugeneSuleimanov  ปีที่แล้ว

      Спасибо за комментарий!
      1. JwtUserDetailsService является реализацией UserDetailsService.
      2. В целом, мы могли бы пропустить этот этап. Но иногда мы делаем это, для обработки случаев блокировки юзера. Т.е. есть токен на месяц. Человека заблокировали в БД, но токен еще валиден. И человек сможет иметь доступ к системе.
      3. Login выдает токен, в остальных местах, мы его проверяем в рамках аутентификации.
      Надеюсь, я верно понял ваши вопросы и смог на них ответить.

    • @Shikarno_3000
      @Shikarno_3000 ปีที่แล้ว

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

  • @user-js4px6fe1p
    @user-js4px6fe1p 4 ปีที่แล้ว

    спасибо!

  • @alexandarv.2688
    @alexandarv.2688 5 ปีที่แล้ว +1

    Офигенный видос. Но вот только я немного не понял почему автор пропустил поле password в DTO.

    • @EugeneSuleimanov
      @EugeneSuleimanov  5 ปีที่แล้ว

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

    • @4val0v
      @4val0v 5 ปีที่แล้ว

      @@EugeneSuleimanov DTO хорошо, а можно пример как работать с mapstruct ?
      В рунете ничего нет по mupstruct ;(((

  • @Igorch81
    @Igorch81 2 ปีที่แล้ว

    Спасибо за отличный урок!
    Просьба разъяснить насколько это хороший тон или насколько это актуальный подход, что при каждом REST запросе идет обращение в базу для получения данных пользователя. Разве не требуется поместить эти данные в claims?
    Спасибо!

  • @firewatermoonsun
    @firewatermoonsun 2 ปีที่แล้ว

    1:10:15 При вводе неправильного пароля "throw new BadCredentialsException("Invalid username or password");" кажется не сработал? Не вижу этого сообщения в json response.

  • @leetcode_over_khinkali
    @leetcode_over_khinkali 3 ปีที่แล้ว

    С транзакционными методами в сервисах падает:
    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'springSecurityConfig': Unsatisfied dependency expressed through field 'jwtTokenProvider'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.security.jwt.JwtTokenProvider' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier("jwtTokenProviderImpl")}

  • @MrCurill
    @MrCurill 4 ปีที่แล้ว

    Большое спасибо за урок! Не смог понять только, как сделать так, чтобы при отправке POST /auth/login передавался зашифрованный пароль и сравнивался напрямую с тем, что лежит в базе.

    • @user-jd3yo6jx9h
      @user-jd3yo6jx9h 4 ปีที่แล้ว

      Никак. Пароль в данном демоуроке не шифруется, а хешируется. Плюс "приготовление" ХЭШа идет с солью. Т.е. один и тот же пароль будет всякий раз давать разный ХЭШ. Но всегда есть возможность имея оригинальный пароль проверить, а от него ли ХЭШ, что здесь и делается. А если вас волнует передача пароля в открытом виде, то вас больше должна волновать передача токена в открытом виде. Эта операция выполняется куда чаще. Но! Взаимодействие клиент-сервер здесь идет по протоколу HTTP. Всего то нужно перейти на HTTPS запросы, что исключит возможность узнать пароль путем анализа трафика. А для этого просто "прикрутите" SSL сертификат к Spring Boot. В Инете полно инфы на эту тему.

  • @timyp64
    @timyp64 2 ปีที่แล้ว

    А как можно совместить авторизацию с вводом пароля и логина + csrf токен(стандартную для спринг секьюрити) и jwt для подальшего использования (после авторизации) при отправке запросов на сервер? Подскажите.

  • @brsbrs9275
    @brsbrs9275 3 ปีที่แล้ว +1

    Евгений, спасибо за урок!
    Вопрос: если мы маппим юзеров и роли через @ManyToMany, то в итоге получаем три таблички (users, roles, users_roles), однако, если мы сделаем @ManyToOne, то у нас будет только две таблицы (users, user_role(Id, user_id, role) и нужно указать уникальную связку user_id+role).
    Есть ли между этими подходами принципиальная разница и, если есть, то какой лучше?

    • @EugeneSuleimanov
      @EugeneSuleimanov  3 ปีที่แล้ว

      В данном случае - нет, но, тогда мы не сможем присвоить юзеру несколько ролей. Это, не критично, потому что мы можем дать каждой роли определённые права (добавить коллекцию пермишенов, например).
      Сказать, какой лучше сложно, но, я бы использовать @ManyToOne в реальной жизни.

  • @AXE0707
    @AXE0707 4 ปีที่แล้ว +1

    Евгений спасибо большое за видео. На текущий момент это единственное видео, которое мне помогло добавить авторизацию с jwt. У меня есть небольшой пет проект с Spring Boot и Angular, где я успешно внедрил данную технологию, но так же у меня остались вопросы в частности о том как создавать refresh токен и как с ним работать. Но больше всего мне интересно как работать с Oauth2 и как совместить его с jwt. Как бы я не старался, у меня не получается совместить их вместе из-за очевидной нехватки знаний и опыта в этих технологиях. Как сделать так, что при запросе с сервера Angular по REST пришел запрос на сервер Spring и Spring обратился к внешнему серверу(Facebook, Google etc, на которых у меня заранее установлено приложение и известны все данные в виде секретного ключа и так далее) и получил от них ответ в виде данных пользователя, который потом передаст по REST другому серверу(Angular). Такая же схема работы с jwt и по сути они отличаются только тем, что от внешнего сервера(Angular) в случае авторизации через Oauth2 запрос приходит с пустым телом(т.к. нет ни пароля ни логина, они вводятся на стороннем 3м сервере). В конченом итоге я хочу реализовать авторизацию пользователя на выбор: или через внутреннюю самого сайта, или через внешнюю(Facebook, Google etc). Все эти сведения только лишь теоретические. Как это реализовать? Куда смотреть-хотя бы на каких ресурсах внятно это объясняется или я не так понимаю, ибо чем больше я ищу информации про REST авторизацию с Oauth2, тем больше у меня возникает вопросов. В идеале хотелось бы увидеть Ваше видеоруководство на подобии текущего, где будет освещенная данная проблема, т.к. я считаю данный вопрос не является каким то частным случаем, на каждом современном веб-ресурсе присутствует авторизация двумя вышеперечисленными способами. Даже на украинском гос.сайте по оплате ЖКХ услуг есть авторизация через гитхаб.

    • @EugeneSuleimanov
      @EugeneSuleimanov  4 ปีที่แล้ว +1

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

    • @Multi111111112
      @Multi111111112 ปีที่แล้ว

      100% уже неактуально для автора вопроса, но для ищущих информацию может быть полезно. Шестое издание "Spring в действии" помогает в реализации по данной тематике. Глава 5.3.3.

  • @VDHCUR
    @VDHCUR 3 ปีที่แล้ว +1

    Спасибо за видео!
    Делаю по вашему примеру и возникла проблема: при отправке невалидного токена JwtAuthenticationException возвращает HTML вместо JSON. AuthenticationEntryPoint перехватывает эту ошибку, только в случае пустого токена, при каких либо данных в токене возвращается HTML.
    Подскажите, как это можно обработать, а то уже который день над этим бьюсь) Заранее спасибо :)

    • @kassymbekoff
      @kassymbekoff 3 ปีที่แล้ว

      Разобрались?) Я тоже на этом застрял))

  • @evgeniizavodnov3086
    @evgeniizavodnov3086 4 ปีที่แล้ว +3

    В dto (как и в model) пихать конвертеры так себе идея. Имхо использовать org.springframework.core.convert.converter.Converter было бы правильнее. @Autowired аннотация перед конструктором в используемой версии Spring Core необязательна.

    • @RatijasT
      @RatijasT 4 ปีที่แล้ว

      полагаться на логику какой-то внешней магии для работы с вашими бизнес-моделями? ну такое себе

    • @evgeniizavodnov3086
      @evgeniizavodnov3086 4 ปีที่แล้ว +1

      @@RatijasT @@RatijasT Ну если стандартные средства springframework для вас магия, то да - 'такое себе'. Вместо чтения документации на фреймворк, можно вполне себе запилить свой конвертер с блекджеком и прочими пряниками. Да и, чего уж там, вообще свой спринг написать, мало ли какая там ещё магия попадется.

    • @RatijasT
      @RatijasT 4 ปีที่แล้ว

      @@evgeniizavodnov3086 так говорите, как будто спринг это не магия, ну действительно

  • @markifive
    @markifive 2 ปีที่แล้ว +1

    Евгений спасибо за ролик по нём написал свой первый jwt для своего проекта. Но мне не совсем ясно зачем админу давали роль и админа и юзера ? Для ендпоинта админа дали роль админа для всех остальных запросов у нас authenticated же есть.

    • @EugeneSuleimanov
      @EugeneSuleimanov  2 ปีที่แล้ว +1

      Спасибо за отзыв!
      Даётся набор ролей для гибкости, так как здесь не используются пермишены. В нормальной практике - будет одна роль с набором доступов.

    • @markifive
      @markifive 2 ปีที่แล้ว

      @@EugeneSuleimanov но если бы мы админу не дали права USER он бы смог всё равно пользоваться всеми запросами согласно нашей конфигурации. Верно ?

  • @adlhbgreqk
    @adlhbgreqk 3 ปีที่แล้ว

    А почему классам User и Role нельзя сразу имплементировать интерфейсы UserDetails и GrantedAuthority соответственно?

  • @artemryvkin6885
    @artemryvkin6885 2 ปีที่แล้ว

    а где реализация RoleRepository и UserRepository? это же только интерфейсы. Может я что то упустил конечно ... Там нет бинов для этих объектов. При запуске проекта ошибка вылетает

  • @kassymbekoff
    @kassymbekoff 3 ปีที่แล้ว

    Спасибо за урок! Когда истекает срок jwt token-а spring возвращает html страницу, а надо ведь json, пробовал ControllerAdvice, результата нет, пока ищу ответ. Как можно это решить?

  • @AquaChanneOne
    @AquaChanneOne 4 ปีที่แล้ว +2

    Спасибо огромное за видео!
    Возник вопрос: когда пишу в AuthenticationRestControllerV1 аннотацию Autowired у конструктора, то authenticationManager подсвечивается красным и пишет: No beans of "AuthenticationManager" type not found. В чём может быть причина?

    • @AquaChanneOne
      @AquaChanneOne 4 ปีที่แล้ว +3

      Если у кого-то была такая ошибка, то она возникает по причине того, что в SecurityConfig у authenticationManager() нужно добавить @Bean

    • @EugeneSuleimanov
      @EugeneSuleimanov  4 ปีที่แล้ว +1

      Спасибо за отзыв.
      Если работает корректно, то вероятнее всего, проблемы в настройках idea. Если нет - нужно поискать ошибку в коде. Особенно, аннотации.

    • @EugeneSuleimanov
      @EugeneSuleimanov  4 ปีที่แล้ว +1

      @@AquaChanneOne только сейчас увидел ответ

    • @AquaChanneOne
      @AquaChanneOne 4 ปีที่แล้ว +3

      @@EugeneSuleimanov Можно ещё вопрос спросить:
      Открыл ваш проект, ничего не менял, в нём ошибка возникает в классе JwtTokenProvider у поля userDetailsService:
      Could not autowire. There is more than one bean of 'UserDetailsService' type.
      Beans: inMemoryUserDetailsManager (UserDetailsServiceAutoConfiguration. class)
      С чем это может быть связано? Также и у меня в моём проекте, который я создавал параллельно вашему видео, такая же ошибка.

    • @user-ux2lw7oh5z
      @user-ux2lw7oh5z 4 ปีที่แล้ว

      @@AquaChanneOneОшибка с authenticationManager, в моем случае, возникла, потому что забыл на класс SecurityConfig повесить аннотацию @Configuration

  • @User-pg2os
    @User-pg2os ปีที่แล้ว

    Добрый день! Проясните, пожалуйста, такой момент.
    В методе контроллера login вызывается
    authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, requestDto.getPassword()));
    Какая реализация используеться для authenticationManager?
    Каким образом он понимает, как валидировать пароль и логин?
    Спасибо заранее!

  • @Shikarno_3000
    @Shikarno_3000 ปีที่แล้ว

    Евгений, Доброго дня вам.
    Может у вас будет секундочка, поделиться вашим опытом.
    При версии выше java 8 TextCodec.BASE64.decode нужного класса не находит, т.к. он из Java EE как я понял, но все же добавить библиотеку jaxb-api не сложно и все работает.
    Если вы делали подобное на версиях выше Java 8, есть ли какой-то другой подход ? Какие-то новые технологии ?
    Если кому-то требуется чтобы работало выше чем на Java 8, добавьте в POM dependency

    javax.xml.bind
    jaxb-api
    2.3.0


    com.sun.xml.bind
    jaxb-impl
    2.3.0


    com.sun.xml.bind
    jaxb-core
    2.3.0


    javax.activation
    activation
    1.1.1

  • @alexander.shakhov
    @alexander.shakhov 5 ปีที่แล้ว +1

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

    • @EugeneSuleimanov
      @EugeneSuleimanov  5 ปีที่แล้ว

      А что именно здесь на подходит к реальному коду? Спасибо

    • @alexander.shakhov
      @alexander.shakhov 5 ปีที่แล้ว +2

      @@EugeneSuleimanov
      1. это передача пароля в теле запроса для получения access token плохая практика. Вообще лучше воспользоваться одним из способов авторизации Oauth2 (client credentials, implicit, password или authoriziation code). С передачей Scope, GrantType и так далее. Но опять же я понимаю что виде чисто в обчающих целях и упор на другое.
      2. Если используете lombok то имеет смысл использовать его тогда везде чтобы быть консистентным. Например в классе JwtUser можно использовать @Getter над классом. Там где явно объявлен конструктор можно заменить на @RequiredArgsConstructor или @AllArgsConstructor а для конструктора по умолчанию @NoArgsConstructor. но это опять так вопрос стиля то как принято в команде.
      4. Зачем переопределять JwtAuthenticationException? там нет ничего кастомного можно сразу кидать AuthenticationException
      5. Если юзер нет то лучше возвращать 404 а не 204.
      6. Отсутствие тестов
      Ну и так далее

    • @EugeneSuleimanov
      @EugeneSuleimanov  5 ปีที่แล้ว +1

      @@alexander.shakhov в этом плане, да. Согласен. Спасибо за ответ.

    • @alexander.shakhov
      @alexander.shakhov 5 ปีที่แล้ว +1

      Eugene Suleimanov вам спасибо за уроки, это большой труд!

    • @user-ml2et9iw2l
      @user-ml2et9iw2l 4 ปีที่แล้ว

      @@alexander.shakhov так Oauth2 необходим для связи VK /FACEBOOK/ GOOGLE. Разве на oAuth2 можно реализовать функционал собственной регистрации?

  • @vladigasparo1763
    @vladigasparo1763 ปีที่แล้ว

    Здравствуйте, кто может подсказать WebSecurityConfigurerAdapter как я понял устарел на сегодняшний день. Чем можно его заменить? Заранее спасибо

    • @user-bc4rz4no9l
      @user-bc4rz4no9l ปีที่แล้ว

      я в итоге использую Спринг Бут второй версии и Секьюрити соовтетсвенно, не смог разобраться как все в обновленном виде работать должно.

  • @belysheva80
    @belysheva80 4 ปีที่แล้ว

    Спасибо большое за видео! Подскажите, пожалуйста, а если у нас LDAP авторизация, подход остается тот же?

  • @Ackois
    @Ackois 3 ปีที่แล้ว

    Добрый день! Проясните, пожалуйста, такой момент.
    В методе контроллера login вызывается
    authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, requestDto.getPassword()));
    При этом, насколько я понял, используется дефолтный AuthenticationManagerDelegator в качестве реализации.
    Если так, то в каким образом он понимает, как валидировать пароль при логине? То есть как связаны конкретно ваша таблица с паролями и сущность authenticationManager?

  • @mohen-tohen
    @mohen-tohen ปีที่แล้ว

    а как с помощью сервиса авторизации получать доступ к другим сервисами, которые находятся вне сервиса авторизации?

  • @alexandrugrubneac4199
    @alexandrugrubneac4199 3 ปีที่แล้ว

    @Eugene Suleimanov: Благодаря Вашим видео учусь писать правильно код. Спасибо за это огромное. Вопрос: В чем смысл аннотации @Table @Column если имя совпадает с названием таблицы/столбца ?

    • @EugeneSuleimanov
      @EugeneSuleimanov  3 ปีที่แล้ว +1

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

  • @ShekRust
    @ShekRust 3 ปีที่แล้ว +2

    Хотелось бы, чтобы схема происходящего, представленная в начале, была подробной и без спешки. Если, конечно, это делается не ради видео, а ради того, чтобы зрители поняли суть.
    Что мы видим на схеме: Client и Server.
    Что мы видим дальше: JwtUser, JwtUserFactory, JwtUserDetailsService, JwtTokenProvider, JwtTokenFilter, JwtConfigurer...
    Получается не гайд, а квест.

  • @nikolaykalmykov9025
    @nikolaykalmykov9025 3 ปีที่แล้ว

    Добрый день. Отличная работа, очень благодарен. Но возникает один вопрос. Как данный сервис использовать между всеми докеризированными микросервисами? Не создавать же отдельный jwt server для каждого. Должно быть решение.

  • @shivassjj4947
    @shivassjj4947 ปีที่แล้ว

    Кто может подсказать в чём разница между сущностью и перечислением для ролей в спринг секьюрити?

    • @EugeneSuleimanov
      @EugeneSuleimanov  ปีที่แล้ว

      С точки зрения спринга - никакой. Это больше об архитектуре решения и структуре проекта.

  • @romanmekelyta4640
    @romanmekelyta4640 5 ปีที่แล้ว +1

    Женя у меня не находит authenticationManager бина.( в AuthenticationRestController в конструкторе есть, автоваред стоит.((

    • @Gibsonen
      @Gibsonen 5 ปีที่แล้ว

      так это не бин

    • @AquaChanneOne
      @AquaChanneOne 4 ปีที่แล้ว

      Привет! нашёл причину?

  • @tatiana-mih
    @tatiana-mih 2 ปีที่แล้ว

    Добавила юзеру ещё одну роль(отношение ведь многие-ко-многим) и юзер после этого перестал проходить аутентификацию. До того как роль была добавлена, аутентификацию проходил. В бд после операции у юзера две роли. Не могу понять, где ошибка. Может, кто сталкивался с этой проблемой.

    • @tatiana-mih
      @tatiana-mih 2 ปีที่แล้ว

      Разобралась с ошибкой, спасибо огромное за урок

  • @aydinkadyrov
    @aydinkadyrov ปีที่แล้ว +1

    Спасибо! А есть ли пример для микросервисов?

    • @EugeneSuleimanov
      @EugeneSuleimanov  ปีที่แล้ว +1

      Спасибо за отзыв! С микросервисами ещё нет, к сожалению.

  • @vladimirpopov8790
    @vladimirpopov8790 3 ปีที่แล้ว

    Благодарю за видео! разбираю сейчас данную тему. не могу понять в каком месте spring security сверяется с базой данных? у меня BadCredentialsException на строчке authenticationManager.authenticate.. база данных postge