JWT-аутентификация для нативных приложений - Spring Security

Поделиться
HTML-код
  • Опубликовано: 2 июл 2023
  • JWT-аутентификация - это токен-аутентификация с использованием ключей доступа сериализованных в формате JWT - JSON Web Token.
    В этом ролике я продемонстрирую реализацию получения и обновления ключей доступа, аутентификации при их помощи, а так же блокировку ключей.
    Репозиторий проекта: github.com/alex-kosarev/sprin...
    #java #jwt #springsecurity
    Мой сайт: alexkosarev.name/
    Паблик в VK: public218833461
    Канал в Telegram: t.me/+TZCuO38vG3oqu_Jq
    Стать доном: donut/shurik.codes
    Донаты в Boosty: boosty.to/akosarev/purchase/1...
    Донаты в Tinkoff: www.tinkoff.ru/cf/4PEOiVCZQuS

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

  • @kowalski1888
    @kowalski1888 2 месяца назад +3

    Огромное спасибо за твой труд! Не смотря на то, что уроки действительно получаются долгими и к концу в голове каша из фильтров и токенов, я бы с удовольствием потратил ещё 10-15 минут на просмотр "разбора полётов" по материалу. Хотелось бы услышать хотя бы вкраце что для чего нужно и алгоритм взаимодействия всего этого между собой. Ещё раз спасибо!!

  • @pavelshackih
    @pavelshackih 5 месяцев назад +7

    Здравствуйте! Пожалуйста не переживайте по поводу времени ролика, тема большая и сложная, было очень интересно.

  • @Jahikka
    @Jahikka 5 месяцев назад +5

    Три и дня (без "и три ночи :D") разбирался что к чему, подходя к теме без углубленных знаний Spring Security (максимум, знал про контекст безопасности, роутинг и какие-то дефолтные настройки, да и всё касается секьюрности через сессии, а не токены), без фундаментальных знаний о JWT, но всё-таки всё получилось, благодаря Вам) Очень много различных статей на тему jwt, в которых или суть до конца не раскрывается и непонятно как работать, или делается грязно и неправильно с учетом той же секьюрности.
    Было сложно, интересно, местами непонятно и запутанно (к середине я уже перестал понимать, где я, кто я и что за что отвечает и как коммуницирует друг с другом), но в конце, просмотрев все классы по порядку, опираясь на конфигурер, стало гораздо понятнее) Спасибо большое, очень понравилось объяснение и разъянение, слушать приятно, очень жаль, что не наткнулся на канал раньше) Присмотрел для себя много тем, в которые хотелось бы углубиться)

  • @user-iu6yz6ck6h
    @user-iu6yz6ck6h 11 месяцев назад +3

    Очень круто, спасибо!

  • @54SperMan
    @54SperMan 7 месяцев назад +1

    ОГРОМНОЕ СПАСИБО за ролик, очень помог!)

  • @veniaminsamoylov1617
    @veniaminsamoylov1617 Месяц назад +1

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

  • @krab9512
    @krab9512 11 месяцев назад +3

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

  • @rainrainov4495
    @rainrainov4495 2 месяца назад +1

    Комментарий в поддержку канала. Так держать.

  • @vla-zav
    @vla-zav 11 месяцев назад +3

    Очень годно!👏

  • @vip51000
    @vip51000 11 месяцев назад +2

    Какой же ты красавчик!

  • @BabaykaMoscow
    @BabaykaMoscow 11 месяцев назад +2

    Это, пожалуй, самое лучшее видео из вообще всех, что я видел по части реализации JWT-авторизации. Было бы круто, если бы было показано как и /login закастомайзить вместо использования стандартной бейсик-аутентификации, но концептуально это и так понятно как сделать. Вы - огонь! Спасибо!

    • @shurik_codes
      @shurik_codes  11 месяцев назад

      Про аутентификацию при помощи формы есть в следующем видео)

    • @BabaykaMoscow
      @BabaykaMoscow 11 месяцев назад

      @@shurik_codes посмотрю, спасибо! Есть в планах аутентификация с помощью нескольких провайдеров? Например, в базе через jdbc, а если не вышло, через *** (например, ldap).

    • @shurik_codes
      @shurik_codes  11 месяцев назад +3

      Так это делается при помощи нескольких вызовов метода authenticationProvider() у HttpSecurity) Можно сколько угодно провайдеров добавить таким образом. Отдельно ролика с демонстрацией этого, возможно, не будет, но будет ролик, посвящённый детальной настройке цепочки фильтров безопасности.

    • @BabaykaMoscow
      @BabaykaMoscow 11 месяцев назад

      @@shurik_codes супер!

  • @alexkoren7648
    @alexkoren7648 3 месяца назад +1

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

  • @ji1ja
    @ji1ja 3 месяца назад +1

    Бомба пушка просто

  • @trymad693
    @trymad693 7 месяцев назад +2

    Спасибо за то что делаете ролики по спрингу, на русскоязычном ютубе актуальных и одновременно качественных материалов как у вас достаточно мало. Еще вопрос, вы сказали что не используете lombok на практике, есть ли какие либо минусы в его использовании, из за которых им лучше пренебречь, или это лишь вопрос предпочтений?

    • @shurik_codes
      @shurik_codes  7 месяцев назад

      В большей степени это вопрос предпочтений

  • @ZamalSpace
    @ZamalSpace 8 месяцев назад +1

    А я бы не против и хоть 10-ти часовой ролик смотреть. Я к тому, ты говоришь, что если делать все правильно с точки зрения архитектуры, то ролик будет дольше по времени. В любом случае спасибо за труд и за то что делишься!

  • @svrd-tech
    @svrd-tech 9 месяцев назад +1

    Спасибо за ролик! В самом начале была оговорка про большое количество примеров где аутентификация делается через контроллер (в нем ИМХО как будто бы ощущается бОльший контроль над ситуацией), но так действительно выглядит каноничнее) Но тут появился такой вопрос - что делать, если у нас например аутентификация двухфакторная? Допустим, при получении логина-пароля мы генерим код, идем в редис и складываем ТОТР, который ожидаем в следующем запросе, на который уже и возвращаем токены. С контроллером как будто бы понятно как это сделать, а как быть без него?

    • @shurik_codes
      @shurik_codes  9 месяцев назад +1

      Есть два варианта реализации:
      1. Передавать второй пароль в одном запросе с логином и основным паролем. Это потребует изменения в фильтре аутентификации, новой реализации Authentication и AuthenticationProvider
      2. Если хочется всё же передавать второй фактор отдельным запросом, то потребуются два дополнительных фильтра: первый будет проверять подтверждённость второго фактора (в файлах куки, сессии и т.д.) и при её отсутствии перенаправлять на страницу ввода второго фактора, второй будет уже запускать проверку второго фактора при отправке запроса из формы ввода второго фактора.
      Кстати, сохранять одноразовый пароль в редис нет смысла, вычисление пароля не такая уж и ресурсоёмкая операция.
      Ролик про двухфакторную аутентификацию будет.

    • @svrd-tech
      @svrd-tech 9 месяцев назад

      @@shurik_codes спасибо!

  • @user-jc6ku1jk2c
    @user-jc6ku1jk2c 2 месяца назад +1

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

    • @shurik_codes
      @shurik_codes  2 месяца назад

      Да, демонстрируется вариант для приложений на основе Servlet API, для реактивщины ролики ещё впереди

  • @user-kk5xm9ph1g
    @user-kk5xm9ph1g 5 месяцев назад

    Спасибо за классное видео! Хотелось узнать, почему выбор пал на использование nimbus jose jwt ? В Spring есть Spring Authorization Server (раньше был Spring Security OAuth). По мне лучше использовать spring стек, а если есть проблемы, то только тогда переходить на сторонние библиотеки. Может есть какие-то проблемы с Spring Authorization Server ?

    • @shurik_codes
      @shurik_codes  5 месяцев назад +1

      В данном ролике демонстрируется аутентификация при помощи JWT-токенов в чистом виде, вне контекста OAuth/OIDC, поэтому не Spring Authorization Server.

  • @jj8902
    @jj8902 6 месяцев назад +1

    Добрый день, после просмотра видео появилось несколько вопросов:
    1. В каких случаях может использоваться logout? Как я понял, запрос на логаут отправляется со стороны клиента после выполнения refresh для удаления старых токенов. Исходя из других источников, в случае обновления токенов, возвращается как access, так и refresh, поэтому старый refresh токен должен перестать функционировать.
    2. В некоторых полях вы указывали стандартную реализацию как Object::toString. Что именно будет происходить, если не присвоить такой переменной другой объект?

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

      1. В моей логике refresh-токен может выдать только новый access-токен, но не refresh. Тем не менее, JTI у всех их должен быть один, и по нему должна быть возможность заблокировать все токены разом на случай, если какой-то токен был скомпроментирован.
      2. Просто возвращает обычное строковое представление

    • @jj8902
      @jj8902 6 месяцев назад +1

      Огромное спасибо!@@shurik_codes

  • @greenstar3583
    @greenstar3583 9 месяцев назад

    Здравствуйте. Прежде всего большое спасибо за отличное видео.a у меня есть вопрос. я отправил запрос к API "/manager.html" с токеном "Bearer". и это сработало. Но это сработало, даже если я сделал запрос к этому API с токеном «Basic». Должны ли мы исправить эту часть самостоятельно? или я что-то пропустил? Я думаю, что «BasicAuthenticationFilter» делает это.

    • @shurik_codes
      @shurik_codes  9 месяцев назад

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

  • @paradiesd
    @paradiesd 11 месяцев назад +2

    Спасибо, видео очень крутое получилось, ты точно не зря старался
    Думаю, что люди будут даже через много времени будут обраться к этому видео
    Подскажи пожалуйста, keycloak как я понимаю в мое приложение отправляет jwtToken, и из него строиться Authentication, как вмешаться в этот процесс создания ? Чтобы допустим изменить что-нибудь
    Я подумал, что это что-то похожее на твой UserDetailsService, но не уверен

    • @shurik_codes
      @shurik_codes  11 месяцев назад +1

      В ролике про Keycloak я упоминал JwtAuthenticationConverter, этот класс можно расширить и изменить логику преобразования Jwt в AbstractAuthenticationToken (это для ресурс-сервера). Впрочем, исходный JWT всегда доступен через JwtAuthenticationToken.getPrincipal().
      Для OAuth-логина логику можно изменять, например, в OAuth2UserService, что я тоже показывал в том же ролике.

    • @paradiesd
      @paradiesd 11 месяцев назад

      @@shurik_codes спасибо

  • @user-rf8mq7cf7y
    @user-rf8mq7cf7y 4 месяца назад

    Привет, а я бы хотел уточнить, получается сначала юзер получает userpass аутентификацию, которая даёт получить токены, но каким образом дальше такой тип аутентификации перекрывается pre authenticated токеном?

    • @shurik_codes
      @shurik_codes  4 месяца назад

      Basic-аутентификация игнорируется при использовании JWT, т.к. на момент получения запроса фильтром Basic-аутентификации пользователь уже аутентифицирован, т.к. фильтр JWT-аутентификации в цепочке фильтров безопасности располагается перед фильтром Basic-аутентификации

  • @user-iu6yz6ck6h
    @user-iu6yz6ck6h 11 месяцев назад +1

    Можно вопрос? Как можно было бы сделать: я реализую resource server (перехожу со старой версии где сервер через наследование ResourceServerAdapter). Для проверки подписи я использую публичный ключ с auth сервера /oauth/token_key. Но он возвращает json {"alg": "", "value": "публичный ключ в формате PEM"}. Стандартная история с jwk-set-uri параметром в конфиге, где по идее должны возвращаться данные по публичному ключу, ругается что у меня в /oauth/token_key нет keys=). Json не содержит обязательных полей Есть ли стандартные решения этой проблемы (какой-нибуть декодер или провайдер для переопределения)? Если возможность не городить велосипеды ?)))

    • @shurik_codes
      @shurik_codes  11 месяцев назад

      Вот сходу не скажу, надо смотреть, но обычно есть точки внедрения

    • @user-iu6yz6ck6h
      @user-iu6yz6ck6h 11 месяцев назад

      @@shurik_codes По идее они должны быть ( но пока не нашел

    • @shurik_codes
      @shurik_codes  11 месяцев назад +1

      Можешь скинуть стек-трейс в Telegram или в VK?

  • @ms_shifu7047
    @ms_shifu7047 2 месяца назад

    передавать authorities/permission в jwt токене это стандартная практика? т.к. их может быть 100 или 200 шт. и в этом слуае размер jwt токена сильно увеличится или это норм?

    • @shurik_codes
      @shurik_codes  2 месяца назад

      Вполне стандартная практика, но если полномочий/ролей сильно много, то в сервисе авторизации нужно предоставлять отдельный эндпоинт для получения списка полномочий пользователя, аналогично userinfo-эндпоинту из OIDC.

  • @alifka6815
    @alifka6815 3 месяца назад

    Доброго времени суток! А почему на практике не пользуетесь Lombok-ом если не секрет))?

    • @shurik_codes
      @shurik_codes  3 месяца назад

      @Data мне заменили record, остальное не особо актуально для меня

    • @rainrainov4495
      @rainrainov4495 2 месяца назад

      @@shurik_codes Для видеоуроков Lombok самое то. Можно часть конструкторов, геттеров с сеттерами и логгеры убрать. А то куче текста сложней сориентироваться.

  • @tami-he4mm
    @tami-he4mm 6 месяцев назад +1

    1. 1:07:32 Вопрос, а почему надо давать роли для refresh-а token-а, почему бы не сделать чтобы все могли делать refresh? (и тоже самое с JWT_LOGOUT, почему для этих действии нужны роли)
    2. Почему ты не сгенерировал новый refresh token?
    3. Почему ты не используешь JPA?
    4. Почему ты добавляешь свои кастомные фильтры после ExceptionTranslationFilter или ты просто первый попавшийся на ум фильтр вбил?

    • @shurik_codes
      @shurik_codes  6 месяцев назад +2

      1. Чтобы только refresh-токены могли управлять сессией. Refresh-токены долгоживущие. Они используются реже, чем access-токены, и их (теоретически) сложнее скомпроментировать. Если access-токены будут иметь возможность продлевать сессию, то это может быть потенциальной уязвимостью.
      2. Забыл
      3. Потому что на практике редко его использую
      4. Чтобы ExceptionTranslationFilter мог обрабатывать исключения

    • @user-cb3tc6tp7n
      @user-cb3tc6tp7n 6 месяцев назад

      @@shurik_codes а JPA чем хуже? медленнее?

  • @Jahikka
    @Jahikka 5 месяцев назад

    Добрый день! Возник вопрос, откуда берутся access-token-key и refresh-token-key в application.yml? Где они генерируются или по какому алгоритму?

    • @shurik_codes
      @shurik_codes  5 месяцев назад

      Я их сгенерировал при помощи OctetSequenceKeyGenerator из JOSE-JWT

    • @Jahikka
      @Jahikka 5 месяцев назад

      @@shurik_codesспасибо большое!

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

    Почему использовать substring правильнее, чем replace?

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

      Используется меньше ресурсов:
      substring - вычисляется длина текущей строки и целевой подстроки и создаётся новый массив, содержащий байты новой строки
      replace - вычисляется длина текущей, заменяемой и заменяющей строк, производится поиск позиций всех заменяемых подстрок в текущей строке, вычисляется размер итоговой строки, создаётся массив байтов итоговой строки, выполняется итеративное копирование символов из текущей строки в массив байт итоговой строки, создаётся итоговая строка

  • @poleg75
    @poleg75 29 дней назад

    У меня вопрос про эту строку в RequestJwtTokensFilter:
    if (this.securityContextRepository.containsContext(request))
    То есть получается что request должен содержать в себе контекст безопасности как атрибут.
    Но откуда он там берется? Кто его устанавливает? Где ранее происходит request.setAttribute() ?
    Вообще не очень понятен этот момент.
    Ранее BasicAuthenticationFilter положил контекст безопасности в SecurityContextHolder.
    А как код в фильтре его достает?

    • @shurik_codes
      @shurik_codes  26 дней назад

      Контекст безопасности появляется на ранних этапах обработки запроса, а информация о пользователе в контексте появляется при обработке запроса фильтром аутентификации.

    • @poleg75
      @poleg75 26 дней назад

      @@shurik_codes Спасибо. А почему используется именно RequestAttributeSecurityContextRepository? Можно же использовать context = SecurityContextHolder.getContext() вместо context = this.securityContextRepository.loadDeferredContext(request).get() и все будет работать. Ну у меня по крайней мере работает )

  • @explo9087
    @explo9087 Месяц назад

    Добрый день. Такое ощущение, что я пропускаю момент в видео получения токена при первичной ацтентификации. Т.е. когда пользователь вводит пароль и логин а в ответ получает токены. Может я непраивльно понимаю как должен протекать весь процесс работы через токены? 1.Пользовательский ввод пароля и логина. 2,В ответ получение токена. 3,Сохранение его на клиенте. 4,Дальнейшие запросы через это токен. Подскажите, плиз

  • @tami-he4mm
    @tami-he4mm 6 месяцев назад

    а как ты делаешь post request на /jwt/tokens, я имею ввиду откуда ты взял этот токен в Authroization: Basic {token}??

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

      Не совсем понял вопроса. Данный запрос обрабатывается фильтром RequestJwtTokensFilter, используется Basic-аутентификация, в которой токен - это Base64-кодированная строка, содержащая логин и пароль пользователя

    • @tami-he4mm
      @tami-he4mm 6 месяцев назад

      @@shurik_codes 38:33 к примеру здесь, я здесь вижу только POST request с header-ом Authorization Basic {и какой-то токен (откуда этот токен?)}, я просто запутался и не понимаю как авторизоваться

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

      Логин/пароль можно подсмотреть в этом файле: github.com/alex-kosarev/spring-security-jwt/blob/main/src/main/resources/data.sql
      Токен, как я уже сказал, при Basic-аутентификации, вычисляется при помощи кодирования логина и пароля в формате Base64:
      Base64.getEncoder().encodeToString("j.jameson:password".getBytes(StandardCharsets.UTF_8)), получается ai5qYW1lc29uOnBhc3N3b3Jk
      в JS это можно сделать при помощи функции btoa("j.jameson:password"), например, ну или любым онлайн-сервисом

    • @tami-he4mm
      @tami-he4mm 6 месяцев назад

      @@shurik_codes понял спасибо большое, а можно узнать почему именно таким способом?

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

      @@tami-he4mm стандартный способ аутентификации при помощи логина/пароля

  • @oopsoops9040
    @oopsoops9040 11 месяцев назад +1

    Дамблдор 🧙‍♂, ты ли это?) Для работы на джуна я должен это всё так же знать?

    • @shurik_codes
      @shurik_codes  11 месяцев назад +3

      Отнюдь, для джуна [бекенд-разработки] на мой взгляд достаточно знать Java (Kotlin, Groovy, нужное подчеркнуть), принципы ООП, базовые структуры данных и алгоритмы, SQL и базово какой-нибудь фреймворк: Spring, Jakarta EE, Quarkus, Micronaut, Helidon. Не глубоко, но достаточно, чтобы написать простое приложение.

    • @rainrainov4495
      @rainrainov4495 2 месяца назад

      @@shurik_codes получается в портфолио с проектами не нужно заморачиватся с добавлением spring security? Без образцов написанного кода резюме как понимаю вообще пропускают и шлют отказы.

  • @Leon-do8tf
    @Leon-do8tf 3 месяца назад

    Это всё великолепно. И я выражаю Вам огромную благодарность за вашу работу. Но я не могу взять в толк: для Rest приложения подобная аутентификация применима или нет? если да, то как?

    • @shurik_codes
      @shurik_codes  2 месяца назад +1

      Получить ключи доступа при помощи RequestJwtTokens, в дальнейших запросах передавать ключ доступа в заголовке Authorizatin: Bearer ...

    • @Leon-do8tf
      @Leon-do8tf 2 месяца назад

      ​@@shurik_codes Возможно глупо говорить что у Вас нет такого класса, но я честно не понимаю из чего мне получить что-то типа authenticateAndGenerateTokens(login, password) в своём рест контроллере. Я так понимаю что этим занимется TokenAuthenticationClientDetailsService и он возвращает public UserDetails loadUserDetails(PreAuthenticatedAuthenticationToken authenticationToken) и дальше я в тупике...

    • @Leon-do8tf
      @Leon-do8tf 2 месяца назад

      ​@@shurik_codes
      POST localhost:8080/jwt/tokens
      Authorization: Basic пожалуйста прокомментируйте что тут за набор символов на минуте 38:42

    • @shurik_codes
      @shurik_codes  2 месяца назад +1

      В первом запросе для получения токенов - Basic-аутентификация с логином/паролем в Base64, в ответ приходит JSON содержащий в себе ключи доступа. Второй запрос уже демонстрирует Bearer-аутентификацию с ключом доступа

    • @Leon-do8tf
      @Leon-do8tf 2 месяца назад

      @@shurik_codes Спасибо

  • @user-ub5yg5sf6z
    @user-ub5yg5sf6z 19 дней назад

    А как у вас удаляются заблокированные просроченные токены из БД, чтобы они не скапливались?

    • @shurik_codes
      @shurik_codes  19 дней назад

      Это несложно реализовать при помощи заданий по расписанию (@Scheduled)

  • @explo9087
    @explo9087 Месяц назад

    28:54 мы выбрасываем ошибку AccessDeniedExeption() А при каких обстоятельсвах она выбрасывается? Просто если неправильные пароль и имя, у меня в фильтр даже не заходит и сразу выдается ошибка 40. При правильной паре имя пароль выдается токен. В другом случае выполняется цепочка фильтров дальше. А как вызвать ошибку из фильтра?

    • @poleg75
      @poleg75 Месяц назад

      Если в запросе не передавать заголовок Authorization, то будет.

    • @explo9087
      @explo9087 Месяц назад

      @@poleg75 спасибо. попробую

  • @sergeys7134
    @sergeys7134 5 месяцев назад +1

    Неужели нельзя все это сконфигурировать в application.yml и не писать столько кода?

    • @shurik_codes
      @shurik_codes  5 месяцев назад

      Чтобы что-то сконфигурировать в application.yml, нужно чтобы это что-то было

  • @user-fl4yw1cr7d
    @user-fl4yw1cr7d 11 месяцев назад

    Интересно, но ОЧЕНЬ замороженная схема получается. Действительно ли это необходимо

    • @shurik_codes
      @shurik_codes  11 месяцев назад

      А в чём конкретно замороченная?

    • @user-fl4yw1cr7d
      @user-fl4yw1cr7d 11 месяцев назад

      @@shurik_codes в создании сериализаторов, десериализаторов, фабрик по созданию токенов. Насколько это все необходимо не ясно, есть же гораздо проще библиотеки. Но да, там не будет энкрипт токен, но для какого уровня сервиса нужны такие токены?

    • @shurik_codes
      @shurik_codes  11 месяцев назад +1

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

  • @dimkaddd7674
    @dimkaddd7674 20 дней назад

    Здравствуйте, а как сделать HTTPS соединение Мобильного приложения и Сервера, чтобы хакер не смог реверснуть Мобильный клиент и получить ключи шифрования?

  • @69ultrapotato
    @69ultrapotato 3 месяца назад

    Не было идеи запизать видос по тестам с спринг секьюрити?

    • @shurik_codes
      @shurik_codes  3 месяца назад

      Возможно, стоит записать

    • @rainrainov4495
      @rainrainov4495 2 месяца назад

      @@shurik_codes Да стоит. Поверхностной информации в ютубе много. А у вас все более углубленно. А с поверхностными знаниями к сожалению трудно в IT пробиться. Кроме того у вас самая актуальная информация в русскоязычном варианте.

  • @_invectys_8935
    @_invectys_8935 7 месяцев назад +1

    я сперва ничего не понял, а потом кааак понял.

  • @valeriyatua
    @valeriyatua 17 дней назад

    Спорный ролик. С одной стороны видно что подход отличается от того что у большинства видео по запросу "SpringBoot JWT" и производных, а с другой стороны возникает вопрос: "Для кого это видео?" Для новичков в Spring Boot появляется больше вопросов чем ответов. Для тех кто в теме это не нужно. Остается только вывод, что тут было показанно экспресс программирование. Пойду наверное ChatGPT опрашивать.

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

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

    • @shurik_codes
      @shurik_codes  6 месяцев назад +2

      а я так теперь и делаю

  • @user-xi1ur5bj6l
    @user-xi1ur5bj6l 16 дней назад

    Очень сложный туториал, очень много чего не сказано, скорее всего из-за - ну это итак должно быть понятно. Приходится разбираться, копаться, с одной стороны полезно, с другой стороны, хотелось бы услышать больше комментариев, так как личные изыскания могут быть неверными.
    Лично я 18 минут ролика 3 рабочих дня изучал. Но может это моя такая пришибленность - хочется видеть всю картину в целом, чтобы было проще изменять частности.
    Даже вопросы типа: "а почему именно jose, а не другая библиотека?" требуют комментариев.