SC24EP04 Безопасность веб-приложений - Разработка проектов со Spring

Поделиться
HTML-код
  • Опубликовано: 10 мар 2024
  • Информационную систему сложно представить себе без аутентификации и авторизации - так или иначе нужно управлять доступом пользователя к тем или иным ресурсам. В четвёртом ролике серии речь пойдёт об обеспечении безопасности веб-приложения при помощи Spring Security и будет продемонстрирована настройка цепочки фильтров безопасности. В рамках ролика демонстрируется использование формы входа, Basic-аутентификации и применение OAuth 2.0/OpenID Connect.
    В цикле роликов "Разработка проектов со Spring" я рассказываю на простых примерах о процессе разработки веб-приложений и REST-сервисов на языке программирования Java с использованием экосистемы Spring. Данный цикл охватывает разработку классических и реактивных проектов, вопросы их сопровождения, такие как документация и мониторинг, адаптацию их к облачной инфраструктуре и процесс их развёртывания в Docker и Kubernetes.
    Репозиторий проекта: github.com/alex-kosarev/sc24/...
    Мои ресурсы:
    - Сайт: alexkosarev.name
    - Канал на RUclips: / @shurik_codes
    - Канал в Telegram: t.me/+TZCuO38vG3oqu_Jq
    - Группа для обсуждений в Telegram: t.me/+UFAkw187WstX0wqy
    - Паблик в VK: shurik.codes
    - Канал в Дзене: dzen.ru/shurik_codes
    - Канал на Rutube: rutube.ru/channel/24432001/
    - Страница в Boosty: boosty.to/akosarev
    Поддержать проект:
    - Доны в VK: donut/shurik.codes
    - Донаты в Boosty: boosty.to/akosarev/donate
    - Через Tinkoff: www.tinkoff.ru/cf/4PEOiVCZQuS
    #java #spring #security #oauth #oidc #authentication #authorization #softwaredevelopment #development

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

  • @user-iq4gb6vh1p
    @user-iq4gb6vh1p 8 дней назад +1

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

  • @denisthestudent
    @denisthestudent 7 дней назад +2

    Спасибо за урок! Для меня тема оказалась сложной, суммарно потратил часов 10, чтобы более менее со всем разобраться. Очень помогло твоё видео про OAuth и OpenID Connect.

  • @user-xk4pl1sr9l
    @user-xk4pl1sr9l 2 месяца назад +5

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

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

    Саш, очередной раз спасибо за отличный контент. Тема действительно непростая. Буду пересматривать твои ролики о Keycloak и Spring Security.
    Такой отличный современный материал и бесплатно - это очень благородно.
    Ребят, кто может финансово поддержать, поддержите, пожалуйста, Сашин проект. Эта инвестиция вам принесет в будущем в разы больше.

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

      А куда донатить?

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

      нашел, отбой

  • @Hocorend
    @Hocorend 18 дней назад +1

    Спасибо за видео, пока не осилил, похоже придется в 2-3 захода, чтобы успеть переварить инфу. Чтобы освоить урок, нужно смело выделять раза в 2-3 больше времени, чем само видео, постоянно останавливаю, пересматриваю отрывками.
    Содержание урока очень насыщенное, я в платных курсах то такого не находил, обязательно потом гляну прошлые уроки тоже. Буду рекомендовать канал к просмотру!

  • @user-ng7ed9dv5i
    @user-ng7ed9dv5i Месяц назад +1

    Курс хорош. Из предложений: для каждого урока использовать свою ветку, а не коммит.

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

    Каждый раз, настраивая базовую ауиентификацию, писал класс, имплементирующий UserDetails. Оказывается, можно без этого. Спасибо, Александр!)

  • @user-ss4nl3zb8v
    @user-ss4nl3zb8v 2 месяца назад +3

    Спасибо за новый урок. Отстаю немного. Загрузили на работе.

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

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

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

    очень приятный человек

  • @Admin-qw7ss
    @Admin-qw7ss 2 месяца назад +2

    спасибо за урок!

  • @user-ub5yg5sf6z
    @user-ub5yg5sf6z 16 дней назад +1

    А зачем нужен первичный ключ id в таблице t_user_authority? Можно обойтись составным ключом id_user + id_autority?

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

    Спасибо. Будем применять.

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

    Круто! Очень.

  • @denis-3
    @denis-3 День назад

    Правильно ли я понял,что keyclock работает только с RestClient ,сначала авторизовываются на нем,а после посылается на сервер? Если да,то можно использовать его только на сервере, без RestClient?(просто REST API)

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

    Это было сильно

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

    Спасибо за урок! Сложная для меня тема, буду пересматривать и вникать, вникать и пересматривать :)
    У меня вопрос: какой способ аутентификации и авторизации лучше использовать для андроид приложения, при условии что сервер самописный и приложение довольно простое(но требующее авторизации)? Сам предполагаю что JWT, но не могу подтвердить свои догадки из-за очень малого наличия информации конкретно по этой теме в интернете.
    И ещё хочу сделать тебе комплимент как контент-мейкеру: только твои видео я могу смотреть не засыпая))) Видео от остальных авторов непременно убаюкивают меня уже после получаса просмотра)) Ещё раз огромное спасибо за твой труд!!

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

      JWT - это всего лишь формат сериализации ключей доступа (по факту пользовательских сессий). На выбор есть два основных варианта: аутентификация по логину/паролю и OAuth 2.0. Если по логину и паролю, то можно использовать либо Basic-аутентификацию, но тогда придётся в каждом запросе передавать логин/пароль в заголовке Authorization, либо при помощи формы, но в этом случае нужно будет где-то хранить идентификатор HTTP-сессии, получаемый через куки. В случае с OAuth 2.0 придётся где-то хранить ключи доступа и реализовывать процесс их получения, хотя это есть в библиотеках.

  • @Hocorend
    @Hocorend 18 дней назад +1

    58:30 Видимо чего-то не понимаю, почему после логаута он всё равно пускает и именно под учеткой j.dewar?
    Почему он не запрашивает логин сразу после логаута, а только при сбросе кеша, вижу только, что SessionId меняется. Это базовый логаут так своеобразно работает?

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

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

    • @Hocorend
      @Hocorend 16 дней назад

      @@shurik_codes Понял, спасибо

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

    Спасибо за видео! Видел практику наследования по типу: CustomUser extends UserDetails - насколько такое допустимо?

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

      Вполне, особенно, когда в данных о пользователе нужно иметь какие-то дополнительные свойства

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

    Столкнулся с тем, что после добавления секурности в catalogue-service (около 12 минуты ролика), запросы на изменение возвращают 500, а внутри manager-app в логах пишется 401. При этом запросы на получение информации (списки, данные по продукту) выполняются нормально.

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

      Странно, точно 401, а не 403? Если 403, то не отключён фильтр CSRF на стороне catalogue-service

    • @user-in8uk6yz9r
      @user-in8uk6yz9r 2 месяца назад

      @@shurik_codesВозвращает 401, возможно это как-то связано с обработкой ошибок в manager-app. Но обратил внимание, что для таких запросов прокидывается csrf информация в запросе. После того как отключил в конфиге безопасности csrf, стали запросы корректно проходить.

    • @Papont
      @Papont 23 дня назад

      аналогично

    • @ausq_cypher
      @ausq_cypher 22 дня назад

      У меня тоже такое было. Просто отключил csrf фильтр в security config - http
      .csrf(AbstractHttpConfigurer::disable).

    • @Hocorend
      @Hocorend 18 дней назад

      Такая же проблема была, спасибо

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

    Александр , вот вы используете keycloak и oAuth на клиентском приложении , т.е там где html грубо говоря , а что если у меня фронтенд вообще отдельно и его пишу даже не я , как быть? Просто писать авторизацию на spring sesecurity с jwt и в каждом эндпоинте делать проверку ?

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

      Яж рассказывал про это в ролике про OAuth и OIDC) Фронт - клиент (grant_type=authorization_code + pkce), бекенд - сервер ресурсов (Spring Security OAuth 2.0 Resource Server). По сути - да, фронт получает ключ доступа и отправляет его в каждом запросе к бекенду, а бекенд ключ валидирует (при помощи Spring Security)

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

      @@shurik_codes просто у вас вот используется keycloak и если при переходе на какуй то страничку человек не авторизовани его перекинет на авторизацию keycloak и вы еще в keycloak регистрировали client (manager-app) , если фронт енд отдельно , как это все реализовать , или если фронт отдельно нет необходимости так делать?

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

      @@shurik_codes а или можно просто на бекенде с помощью oAuth валидировать доступ к эндроинтам грубо говоря , что бы по /api/v1/blablabla могли обращаться только авторизованные пользователи , верно?

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

      Да, верно

  • @viewer_evgeniy
    @viewer_evgeniy 7 дней назад

    Александр, а можете подсказать, в какую сторону двигаться, если на беке используется jwt, который клиенту отдается в теле ответа, то как это обработать с помощью RestClient?
    Мне нужно будет в каждый метод, где подразумевается отправка токена - добавить заголовок с соответствующим содержанием (Bearer + токен)?

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

      Да, нужно добавлять заголовок к каждому запросу

  • @stanislavkuzmin8211
    @stanislavkuzmin8211 3 дня назад

    Добрый день, 53.26 минута, не понятно как у Вас всё работает, если мы оставили в catalogue-service базовую аутенфикацию с ролью SERVICE, у меня вылетает ошибка 401 unauthorized, когда из manager-app вызывается restclient. Или же надо на данном этапе в catalogue-service вообще убрать spring-security?

    • @shurik_codes
      @shurik_codes  3 дня назад

      Да, я забыл упомянуть, но ролик условно разделён на две части: первая посвящена реализации аутентификации и авторизации при помощи формы входа и локальных источников данных о пользователях, вторая (с 36:48) - о применении OAuth/OIDC. Поэтому в репозитории два коммита и тэга к этому ролику.

  • @viewer_evgeniy
    @viewer_evgeniy 8 дней назад

    Положил также кодировку пароля в мейн и заметил, что каждый раз при запуске приложения - BCrypt выдает разные значения для одного и того же пароля. Разве не должно быть всегда одинаковое значение в итоге?

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

      Это нормально, BCrypt возвращает всякий раз новый хэш

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

    Доброго времени суток!
    Я хочу Вас, как специалиста и автора этого замечательного канала и этого нового курса, попросить совета. Я хочу найти первую работу как можно быстрее и для этого я хочу хорошо разбираться в Спринге. Я начал с курса Алишева. Но я хочу с чистой совестью говорить, что я Спринг специалист. Какая теория для этого подойдет? Ваш новый курс подойдет, для того, чтоб после него устроиться на работу?

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

      В этом цикле охватывается большой набор тем, но не в исчерпывающем виде, поэтому я не думаю, что его будет достаточно. Рекомендую как минимум почитать литературу по Spring, хотя бы "Spring в действии" и "Spring для профессионалов".

    • @user-rr7pl3ru9h
      @user-rr7pl3ru9h 2 месяца назад

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

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

    Спасибо за видео! Может ли кто подсказать, как экспортировать полный реалм со всеми пользователями, client-secret и тд?

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

      bin/kc.sh export --realm your-realm --file your-realm.json

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

    Привет! Такая ошибка выскакивает. Всё настраивал по твоему видео. Login with OAuth 2.0
    [invalid_scope] Invalid scopes: openid view_catalogue edit_catalogue microprofile_jwt

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

      Значит в клиент на стороне Keycloak не добавлены указанные скоупы, их можно посмотреть в настройках клиента

    • @bolekrus
      @bolekrus 16 дней назад

      @@shurik_codes Я их добавил в Client -> Client Scopes -> Evaluate, выбрал User j.dewar. Generated access token всё как у тебя. Но scopes там почему-то не сохраняются. Перезагружаю страницу и всё пропадает, остаётся только openid. Кнопки SAVE внизу нет. Что я не так делаю?

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

    При запуске команды выдает docker: Error response from daemon: create config/keycloak/import: "config/keycloak/import" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory,
    use absolute path.
    при docker rm selmag-keycloack Error response from daemon: No such container: selmag-keycloack

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

      как выглядит выполняемая команда?

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

      @@shurik_codes Выполняю именно как Вы в видео docker run --name selmag-keycloak -p 8082:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin -v ./config/keycloak/import:/opt/keycloak/data/import quay.io/keycloak/keycloak:23.0.4 start-dev --import-realm
      а потом так же повторяю команду.

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

      @@shurik_codes я использовал из гит репозитория как разместили.

    • @denisitch
      @denisitch 28 дней назад +1

      @@svyatoiambrozii указывай абсолютный путь к папке в проекте

    • @svyatoiambrozii
      @svyatoiambrozii 27 дней назад +1

      @@denisitch спасибо!)

  • @user-in8uk6yz9r
    @user-in8uk6yz9r 2 месяца назад

    @shurik_codes
    Забавный эффект получился. Перед запуском приложения был добавлен полный список прав пользователя, в т.ч. пришедших из контекста секурности спринга, но в ролике при запуске на 01:01:26 видно, что роль одна ROLE_MANAGER.
    Был немного обескуражен этим: вроде добавили, у меня много еще всяких скопов в ролях пользователя логе, а в ролике [ROLE_MANAGER] )).

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

    Дошел таки до запуска конфигурации и спринг выдает: Parameter 0 of method setFilterChains in org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration required a bean of type 'org.springframework.security.oauth2.client.registration.ClientRegistrationRepository' that could not be found.
    ругается на бин security filter chain

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

      Не сконфигурирован oauth2 клиент в файле свойств

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

    Товарищи, а лучше сам Александр)) помогите уде второй раз переписываю построчно блин. и как тоkько дохожу до oauth2, то всё время это((
    Request processing failed: org.springframework.web.client.HttpClientErrorException$Unauthorized: 401 Unauthorized: [no body]
    Заранее Спасибо

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

      Слишком мало информации. 401 возвращается, когда пользователь не может быть аутентифицирован, код к ролику: github.com/alex-kosarev/sc24/tree/SC24EP04-oauth

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

      @@shurik_codes Извиняюсь за панику) нужно ж было досмотреть до конца таки ролик. а там вы добавили SCOPE и всё теперь можно удалять и изменять...

  • @user-vs6ce8vq2h
    @user-vs6ce8vq2h Месяц назад

    Добрый день! Вопрос по первой части видео - вроде делаю все так же, но при запросах к catalogue-api получаю ошибку
    org.springframework.web.client.HttpClientErrorException$Unauthorized: 401 Unauthorized: "{"timestamp":"2024-04-10T08:21:33.656+00:00","status":401,"error":"Unauthorized","message":"Unauthorized","path":"/catalogue-api/products"}"
    В чем может быть проблема? (csrf.ignoringRequestMatchers уже пробовала)

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

      401 статус говорит о том, что пользователь не аутентифицирован, причин много может быть