Spring Boot JWT. Проект полностью. Реализуем регистрацию и авторизацию. Livecoding SaaS. #1

Поделиться
HTML-код
  • Опубликовано: 27 фев 2021
  • В данном видео реализуем схему авторизации и аутентификации используя JWT токен. Вначале разберем, какие способы авторизации есть, как может нам помочь в этом Spring и Spring Security, разберем схему работы.
    Ссылка на проект - github.com/bseitkazin/spring-...
    Также реализуем авторизацию по ролям.
    Тема авторизации в Spring приложениях - базовая, придется его реализовывать в каждом проекте, или изучать текущею схему работы, если проект уже существует давно.
    В данном видео, показана актуальная схема работы, с изменениями в Spring Security 5.
    --------------------------------------------------------------------------------------------------------------------
    Канал в телеграме, новости, текстовая версия - t.me/codelike
    Посты на Хабр - habr.com/ru/users/beezy92/posts/
    Блог на английском, статический блог, где делюсь заметками по изученным материалам, курсам, книгам, списками книг - bseitkazin.gitlab.io/
    Профиль в линкедин - / bseitkazin
    Мой твиттер - / raundrobin
    Stackoverflow - stackoverflow.com/users/36317...
    Github - github.com/bseitkazin
    --------------------------------------------------------------------------------------------------------------------
    #ityoutubersru #spring #springboots #jwt #java

Комментарии • 67

  • @kassymbekoff
    @kassymbekoff 3 года назад +2

    Спасибо большое за видео! Выкладывайте еще, хорошо получается!

  • @user-op7uj4zg8r
    @user-op7uj4zg8r 2 года назад +1

    Спасибо за урок! Очень пригодился.

  • @jollyroger2757
    @jollyroger2757 3 года назад +4

    Благодарю за видео, как раз jwt мучаю

  • @user-gf7lp2gw6i
    @user-gf7lp2gw6i 2 года назад +1

    Спасибо за ролик.Успехов .

  • @Krazorie
    @Krazorie Год назад

    Ааа! Какой ещё"сервайс"! Отличная лекция, просто идеальная, и тут плетью по ушам: service as "сервайс"...

  • @doncruze5515
    @doncruze5515 Год назад

    чувак от души респект все работает! Очень помог!

  • @user-zt8dj9rp8y
    @user-zt8dj9rp8y 3 года назад +2

    Привет! В таблице user_roles - role_id всегда равна 1. Создаются только ROLE_USER. Использую твой проект с Git.
    В сущности User используется Set roles, а в API запросах указано role, соответственно в API необходимо поправить на "roleS" : ["admin"]
    А так всё чётко и по делу)

    • @bseitkazin
      @bseitkazin  3 года назад +3

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

  • @joma0305
    @joma0305 3 года назад +2

    Оо наконец то!

  • @user-ne5yu5pv4v
    @user-ne5yu5pv4v 2 года назад +1

    Пока слушал, залип на прическу, как будто отдельно от лица шевелится))
    Очень годный контент! Спасибо.

  • @user-ec7xj6jo7t
    @user-ec7xj6jo7t 2 года назад +1

    Спасибо. Делаю pet проект на android. Попробую прикрутить Ваш вариант авторизации и аутентификации.

  • @michaelowen1990
    @michaelowen1990 3 года назад +5

    давно не видел эклипс)

    • @bseitkazin
      @bseitkazin  3 года назад +1

      и в светлой теме)

  • @sobolevaLi
    @sobolevaLi 6 месяцев назад

    Добрый день, очень понравилось ваше видео!
    Хотела бы попросить вас снять видео о тестировании данного api)

  • @memeslord7622
    @memeslord7622 2 года назад

    Лайк!

  • @vls5001
    @vls5001 2 года назад

    Контроллеры получились очень толстыми , в целом полезный урок, спасибо. Как доп задание на понимание, можно рефакторить.

  • @user-mt9kf4mi7x
    @user-mt9kf4mi7x Год назад

    Здравствуйте! Очень познавательное видео! А разве при старте спринг секьюрити не должно отдавать логин и пароль разработчика? А то я думаю если не показывает в консоли что я не так делаю?

  • @minsort
    @minsort 2 года назад +3

    Класс! Особенно понравилось: тестирование - все по-полочкам; контроллер авторизации; подход с Enum в классе ролей. Единственный вопрос (ко всем): на сколько правильно использовать AuthController с такой "расширенной" логикой в prodaction?

    • @bseitkazin
      @bseitkazin  2 года назад +2

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

  • @a.d.4418
    @a.d.4418 3 года назад +1

    GJ

  • @user-lu9pg8vr9x
    @user-lu9pg8vr9x 2 года назад

    можно ли как-то получить теперь все данные из таблицы если роль администратор ? И если возможно могли бы подсказать как?

  • @evialinatech
    @evialinatech 2 года назад +1

    Добрый день !!! Скачать где нибудь можно ?

  • @napeHEK1
    @napeHEK1 2 года назад

    понятно

  • @user-segadev
    @user-segadev 3 года назад +1

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

    • @bseitkazin
      @bseitkazin  2 года назад +1

      Нету лучшего подхода. Зависит от задач и проблем. Например, был Keycloak, но у нас помимо пользователей, были еще и сотрудники с разными должностями и уровнями доступа. Кто-то может создавать контент, а кто-то может апрувить контент и публиковать. И данные записи записываются в отдельной системе, и управляются другими людьми. Одна лишь процедура увольнения чего стоит. И нужно было интегрироваться с LDAP системой. Затем необходимо было реализовать двух-факторную авторизацию (2FA, по смс). После пришел бизнес, и попросил добавить мульти-аккаунт...
      Использование Keycloak позволило адаптироваться под хотелки бизнеса.

  • @TheMixer91
    @TheMixer91 Год назад

    Азамат, очень радостно видеть что вы решили сменить шоу-бизнес на ИТ! Всё в вашем видео прекрастно, кроме использования spring boot. Куда приятнее видеть в проекте только необходимые зависимости вместо постоянно конфликтующих между собой boot контейнеров. Спасибо за видео!

  • @user-kp3yd6rm8b
    @user-kp3yd6rm8b 2 года назад +1

    Спасибо за урок! У меня все же остался вопрос, вы таблицы от руки создавали?

    • @bseitkazin
      @bseitkazin  2 года назад

      Hibernate создаёт за тебя схему.

    • @user-wq9gc4rj3w
      @user-wq9gc4rj3w 2 года назад +1

      @@bseitkazin это с любыми СУБД работает?

    • @user-iw1pl6sc9e
      @user-iw1pl6sc9e 2 года назад +1

      @@user-wq9gc4rj3w да, это можно настроить в application.properties с помощью параметра spring.jpa.hibernate.ddl-auto=create, там есть и другие возможные значения spring.jpa.hibernate.ddl-auto, можно например только дописывать несуществующие столбцы. Короче почитай про этот параметр

  • @svinc9639
    @svinc9639 2 года назад +1

    У меня вот вопрос, могу ли я используя лишь JWT выдать токен с определённой ролью анонимному юзеру (которого нет в бд) ? Если да, то не наведёшь меня где я могу про это копнуть?

    • @bseitkazin
      @bseitkazin  2 года назад

      я бы начал с того, что узнал бы, а какая цель данной операции? для чего нужен токен анонимному пользователю? чем отличается анонимный пользователь А от анонимного пользователя Б? что случится, если два этих анонимного пользователя перепутают токены?
      обычно, мы закрываем REST API при помощи авторизации токенами. и можем прописывать правила, что ресурс (API) публичный, то есть его может вызывать анонимный пользователь. думаю данный подход, перекрывает большинство возможных требовании от бизнеса.

  • @MsDimon1994
    @MsDimon1994 3 года назад +3

    Здорово, но как теперь заставить клиент отправлять этот токен серверу? С помощью ajax?
    Я же хочу приложением пользоваться не через постман)

    • @argenbarakanov2346
      @argenbarakanov2346 3 года назад

      в header положи его там сервер из него же читает

    • @bseitkazin
      @bseitkazin  3 года назад +3

      для этого снял новое видео - ruclips.net/video/GXTorUvK76g/видео.html, тут на Angular реализовал получение токена, и как проставлять токен для каждого секьюрного запроса

  • @iorgankrat1118
    @iorgankrat1118 2 года назад

    добрый день, Вам не приходилось интегрировать aouth2, jwt в спринг бут проект ? даже к существующему проекту было бы интересно прикрутить сервер авторизации (этим и занимаюсь).
    на русскоязычных просторах с этим скудновато, а эта штука сейчас в моде.
    спасибо Вам за видео.

    • @bseitkazin
      @bseitkazin  2 года назад +1

      спасибо на добром слове.
      по вашему вопросу - вы хотите в Spring Boot'е реализовать Authorization Server? или хотите подключить к другому авторизационному серверу?
      если пункт 1 - то да, с этим сложно, и обычно в документации/обучалке показывают как подключиться к github/google.
      если пункт 2 - то команда Spring Security там переписывают все. WebSecurityConfigurerAdapter - уже устарел. Ждем команду, когда выпустят стабильный релиз - 1.0.0.
      есть другой способ - взять что-то готовое - Keykloak, UAA от Cloundfaundry, WSO2 Identity Server - то, что могу вспомнить сходу. И рекомендовал бы выбрать их, чем пытаться реализовать openID стандарт.

  • @user-ny2jr5bc7n
    @user-ny2jr5bc7n Год назад

    Спасибо за урок, но почему-то слишком тихий звук от рассказчика 🤷‍♂️

  • @non_holy6286
    @non_holy6286 2 года назад

    Инжектить лучше по типу интерфейса, а не по типу имплементации - UserDetailsService userDetailsService

  • @vladimirohito6050
    @vladimirohito6050 2 года назад

    вместо пароля к БД нужно хранить название пула соединений в датасорс.вобще никто не работает с БД.

    • @bseitkazin
      @bseitkazin  2 года назад

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

  • @ilnurgayetov3465
    @ilnurgayetov3465 2 года назад +3

    Не знаю как исправили ошибку в самом конце, но я пофиксил поменяв в User модели FetchType на Eager вместо Lazy.

    • @minsort
      @minsort 2 года назад +1

      Спасибо огромное! Если бы не ваш ответ - на вечер бы залип точно!

    • @varvaramamatsiuk6019
      @varvaramamatsiuk6019 Год назад +1

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

    • @user-hj1zu8mu8m
      @user-hj1zu8mu8m Год назад

      Еще можно расширить область действия hibernate сессии поставив @Transactional на соответствующий метод UserDetailsServiceImpl

  • @user-rf3ic9ys2b
    @user-rf3ic9ys2b 3 года назад

    В конце как ошибку исправили?

    • @user-pl1yu4gi6s
      @user-pl1yu4gi6s 3 года назад

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

  • @minsort
    @minsort 2 года назад +1

    Очень странно, что за столько время никто не обратил внимание на ошибку (маленькую): как мы можем отправлять JSON c полем "role": ["admin"](указано в REDME и в видеоуроке), если в классе AuthController в методе registerUser мы заполняем коллекцию так: Set reqRoles = signupRequest.getRoles(). Таким образом, в JSON-объекте мы каждый раз (фактически) передаем null, вместо реальной роли. Должно быть либо - "roles": ["admin"], либо - Set reqRoles = signupRequest.getRole()

    • @bseitkazin
      @bseitkazin  2 года назад

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

  • @vladimirohito6050
    @vladimirohito6050 2 года назад

    Это устарело Jwts.parser().это тоже .signWith(SignatureAlgorithm.HS512, jwtSecret).jjwt 0.11 сейчас последняя версия.BCrypr тоже ничего не генерит.пора освежить видео.

  • @twinklstudio1615
    @twinklstudio1615 3 года назад +1

    ощущение,что вы сами не понимаете до конца,что происходит

    • @bseitkazin
      @bseitkazin  3 года назад +4

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

  • @Ovilord1992
    @Ovilord1992 2 года назад +2

    80% видео просто копипаст, который не дает никакого понимания происходящего.

    • @bseitkazin
      @bseitkazin  2 года назад +1

      для того чтобы снять материал, с начало пишу контент план. за тем реализовываю проект отдельно. после уже идет съемка. если писать код сразу, включив камеру, теряю ход мыслей, могу переписывать код по 100500 раз, и придется записывать много дублей и потратить много времени на монтаж.
      у меня есть работа, и личные проекты, и еще семья. на канале не зарабатываю. это больше хобби. потому, копи-паст, и попутно объяснять, что и для чего делаю - для меня самый приемлемый формат на текущий момент.
      критику услышал. хотел бы от вас услышать, а как бы было лучше? какие есть предложения по улучшению? как вам было бы лучше понять материал?

    • @Ovilord1992
      @Ovilord1992 2 года назад +3

      @@bseitkazin тут стоит подумать, если вы снимаете ролики лично для себя, т.к. я увидел "для меня это самый приемлимый формат", то сильно можете не обращать внимание на мой коммент.
      Если все таки снимаете для того чтоб людям помочь, то лучше в реалтайме писать код.
      У вас в ролике очень много побочной информации было.
      Т.е. если вы хотели снять полный мануал. То разумнее было бы подготовить энтити и начать снимать и писать код на основе этих энтити. Но тему которая важна писать все таки в ручную.
      По факту получилось так что над энтити мы час сидим, а потом за пол часа копипастим jwt и все на этом)
      У вас интересные темы роликов. Но длительность видео и копипаст реально неприятны.
      Кстати, в обучающих роликах хорошо если будете делать ошибки, люди которые смотрят могут столкнуться с проблемами которых вы избежали, просто копированием рабочего кода.
      В общем посыл какой. Короче ролики и писать самому. И будет перфекто)
      Жду новых роликов, как думаю и многие :)

  • @cookiehunter8828
    @cookiehunter8828 Год назад +2

    Урок полное г@вн0, сидел исправлял несколько дней баг с CORS. Желаю удачи тем, кто пытается делать по этому видосу)))

    • @user-yb4cy5to6i
      @user-yb4cy5to6i Год назад

      Жиза братик, тоже несколько дней Eб@лся

    • @bseitkazin
      @bseitkazin  Год назад

      Приветствую! Ну говно и говно! А исправлять ошибки для обучения - очень полезно, чем просто бездумно копи-пастить. И об CORS... Он настраивается отдельно для каждого приложения. Он будет разным, в зависимости от того, будет ли на localhost запущен, или на production сервере.

    • @cookiehunter8828
      @cookiehunter8828 Год назад

      @@bseitkazin Тут вы, конечно, правы. Но все же хотелось бы более корректные материалы...

  • @aliham4228
    @aliham4228 2 года назад +2

    Тебе следует поработать над объяснением материала

    • @bseitkazin
      @bseitkazin  Год назад

      Приветствую. Спасибо за обратную связь. Обязательно поработаю над всем.

  • @kolyanlock
    @kolyanlock 2 года назад

    Можешь подсказать. Как получилось так что AuthenticationProcessingFilter ты не настраивал(по умолчанию там путь /login), а в /signin контроллере пользователь авторизируется? У меня так не проходит. Может это благодаря http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);?

  • @kanekabal416
    @kanekabal416 Год назад

    ЗЫ Ошибка с лейзи инициализацией - поставте @Transactional над методом loadUserByUsername...
    Хорошо что все за тобой получилось, уже лайк... хороша ли практика в контроллере юзать репозитории, или лучше операции с ними выкинуть в сервисы...

  • @karfogengroup807
    @karfogengroup807 Год назад

    у меня ошибка в файле WebSecurityConfig метод configure
    http.addFilterBefore( authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
    В этой строке. Другой тип аргументов.
    Кто-то сталкивался?

  • @slavacheban
    @slavacheban 3 года назад

    Почему если у меня вместо .properties фала есть .yml то не могу достучатся до занчений jwt.secret ?

    • @bseitkazin
      @bseitkazin  3 года назад

      скорее всего ошибка внутри. при yml файле, иерархия ключа другая

  • @morbiuslevakov
    @morbiuslevakov Год назад

    Видео зачётное, но у меня не работал javax, импортировалось всё успешно. Но выдавало ошибки в создании бина при запуске. Перешёл на jakarta.persistence.* он новый и отлично работает со Sprng`ом