Тёмный

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

Уголок сельского джависта
Подписаться 10 тыс.
Просмотров 9 тыс.
50% 1

Информационную систему сложно представить себе без аутентификации и авторизации - так или иначе нужно управлять доступом пользователя к тем или иным ресурсам. В четвёртом ролике серии речь пойдёт об обеспечении безопасности веб-приложения при помощи Spring Security и будет продемонстрирована настройка цепочки фильтров безопасности. В рамках ролика демонстрируется использование формы входа, Basic-аутентификации и применение OAuth 2.0/OpenID Connect.
В цикле роликов "Разработка проектов со Spring" я рассказываю на простых примерах о процессе разработки веб-приложений и REST-сервисов на языке программирования Java с использованием экосистемы Spring. Данный цикл охватывает разработку классических и реактивных проектов, вопросы их сопровождения, такие как документация и мониторинг, адаптацию их к облачной инфраструктуре и процесс их развёртывания в Docker и Kubernetes.
Репозиторий проекта: github.com/ale...
Мои ресурсы:
- Сайт: alexkosarev.name
- Канал на RU-vid: / @shurik_codes
- Канал в Telegram: t.me/+TZCuO38v...
- Группа для обсуждений в Telegram: t.me/+UFAkw187...
- Паблик в VK: shurik....
- Канал в Дзене: dzen.ru/shurik...
- Канал на Rutube: rutube.ru/chan...
- Страница в Boosty: boosty.to/akos...
Поддержать проект:
- Доны в VK: donut/s...
- Донаты в Boosty: boosty.to/akos...
- Через Tinkoff: www.tinkoff.ru...
#java #spring #security #oauth #oidc #authentication #authorization #softwaredevelopment #development

Опубликовано:

 

26 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 84   
@Devivl
@Devivl 6 месяцев назад
Саш, очередной раз спасибо за отличный контент. Тема действительно непростая. Буду пересматривать твои ролики о Keycloak и Spring Security. Такой отличный современный материал и бесплатно - это очень благородно. Ребят, кто может финансово поддержать, поддержите, пожалуйста, Сашин проект. Эта инвестиция вам принесет в будущем в разы больше.
@zackdd6751
@zackdd6751 6 месяцев назад
А куда донатить?
@zackdd6751
@zackdd6751 6 месяцев назад
нашел, отбой
@АязЛотфуллин
@АязЛотфуллин 4 месяца назад
Как же легко усваивается весь материал который вы приподносите. Спасибо вам большое, продолжайте в том же духе👍
@urantech
@urantech 6 месяцев назад
Ставлю лайк перед просмотром, потому что знаю, что у Саши невероятный контент. Спасибо!
@denisthestudent
@denisthestudent 4 месяца назад
Спасибо за урок! Для меня тема оказалась сложной, суммарно потратил часов 10, чтобы более менее со всем разобраться. Очень помогло твоё видео про OAuth и OpenID Connect.
@ЕвгенийАлексеев-о9э
@ЕвгенийАлексеев-о9э 6 месяцев назад
Каждый раз, настраивая базовую ауиентификацию, писал класс, имплементирующий UserDetails. Оказывается, можно без этого. Спасибо, Александр!)
@sermaz-blg
@sermaz-blg 5 месяцев назад
Курс хорош. Из предложений: для каждого урока использовать свою ветку, а не коммит.
@hurricane-rus
@hurricane-rus 2 месяца назад
Спасибо за видео! Тут конечно взрыв мозга, без личной практики невозможно разобраться)
@Hocorend
@Hocorend 4 месяца назад
Спасибо за видео, пока не осилил, похоже придется в 2-3 захода, чтобы успеть переварить инфу. Чтобы освоить урок, нужно смело выделять раза в 2-3 больше времени, чем само видео, постоянно останавливаю, пересматриваю отрывками. Содержание урока очень насыщенное, я в платных курсах то такого не находил, обязательно потом гляну прошлые уроки тоже. Буду рекомендовать канал к просмотру!
@АлександрТяпкин-п2ц
@АлександрТяпкин-п2ц 6 месяцев назад
Спасибо за новый урок. Отстаю немного. Загрузили на работе.
@Константин-ы9к
@Константин-ы9к 5 месяцев назад
Спасибо за качественный материал.
@Admin-qw7ss
@Admin-qw7ss 6 месяцев назад
спасибо за урок!
@zigyias347
@zigyias347 5 месяцев назад
очень приятный человек
@Boraldan
@Boraldan 5 месяцев назад
Спасибо. Будем применять.
@dmaberlin
@dmaberlin 3 месяца назад
Топчик, спасибо!
@raingor
@raingor 2 месяца назад
Кстати, вот что заметил. До 13:40 где ты проверял межсервисное общение, ты проверил только get к страничке и листу. Я повторив секьюр такой же заметил, что если попытаться создать что то , то выдаст 401. Хрен его знает почему, но вот так вот-
@redrikshuhard247
@redrikshuhard247 2 месяца назад
У меня тоже проходят только get обращения, а сделать какие либо изменения (post, patch и delete) выдают 401. Но в комментариях ниже есть решение
@levaryazan
@levaryazan 6 месяцев назад
Круто! Очень.
@goodvideobro
@goodvideobro 6 месяцев назад
Это было сильно
@ГенрихАвдеев-ь9з
@ГенрихАвдеев-ь9з 6 месяцев назад
Столкнулся с тем, что после добавления секурности в catalogue-service (около 12 минуты ролика), запросы на изменение возвращают 500, а внутри manager-app в логах пишется 401. При этом запросы на получение информации (списки, данные по продукту) выполняются нормально.
@shurik_codes
@shurik_codes 6 месяцев назад
Странно, точно 401, а не 403? Если 403, то не отключён фильтр CSRF на стороне catalogue-service
@ГенрихАвдеев-ь9з
@ГенрихАвдеев-ь9з 6 месяцев назад
@@shurik_codesВозвращает 401, возможно это как-то связано с обработкой ошибок в manager-app. Но обратил внимание, что для таких запросов прокидывается csrf информация в запросе. После того как отключил в конфиге безопасности csrf, стали запросы корректно проходить.
@Papont
@Papont 4 месяца назад
аналогично
@ausq_cypher
@ausq_cypher 4 месяца назад
У меня тоже такое было. Просто отключил csrf фильтр в security config - http .csrf(AbstractHttpConfigurer::disable).
@Hocorend
@Hocorend 4 месяца назад
Такая же проблема была, спасибо
@kowalski1888
@kowalski1888 6 месяцев назад
Спасибо за урок! Сложная для меня тема, буду пересматривать и вникать, вникать и пересматривать :) У меня вопрос: какой способ аутентификации и авторизации лучше использовать для андроид приложения, при условии что сервер самописный и приложение довольно простое(но требующее авторизации)? Сам предполагаю что JWT, но не могу подтвердить свои догадки из-за очень малого наличия информации конкретно по этой теме в интернете. И ещё хочу сделать тебе комплимент как контент-мейкеру: только твои видео я могу смотреть не засыпая))) Видео от остальных авторов непременно убаюкивают меня уже после получаса просмотра)) Ещё раз огромное спасибо за твой труд!!
@shurik_codes
@shurik_codes 6 месяцев назад
JWT - это всего лишь формат сериализации ключей доступа (по факту пользовательских сессий). На выбор есть два основных варианта: аутентификация по логину/паролю и OAuth 2.0. Если по логину и паролю, то можно использовать либо Basic-аутентификацию, но тогда придётся в каждом запросе передавать логин/пароль в заголовке Authorization, либо при помощи формы, но в этом случае нужно будет где-то хранить идентификатор HTTP-сессии, получаемый через куки. В случае с OAuth 2.0 придётся где-то хранить ключи доступа и реализовывать процесс их получения, хотя это есть в библиотеках.
@denis-3
@denis-3 3 месяца назад
Правильно ли я понял,что keyclock работает только с RestClient ,сначала авторизовываются на нем,а после посылается на сервер? Если да,то можно использовать его только на сервере, без RestClient?(просто REST API)
@ВладимирБутков-э5э
@ВладимирБутков-э5э 3 месяца назад
Спасибо огромное за такую полезную информацию.
@bolekrus
@bolekrus 4 месяца назад
Привет! Такая ошибка выскакивает. Всё настраивал по твоему видео. Login with OAuth 2.0 [invalid_scope] Invalid scopes: openid view_catalogue edit_catalogue microprofile_jwt
@shurik_codes
@shurik_codes 4 месяца назад
Значит в клиент на стороне Keycloak не добавлены указанные скоупы, их можно посмотреть в настройках клиента
@bolekrus
@bolekrus 4 месяца назад
@@shurik_codes Я их добавил в Client -> Client Scopes -> Evaluate, выбрал User j.dewar. Generated access token всё как у тебя. Но scopes там почему-то не сохраняются. Перезагружаю страницу и всё пропадает, остаётся только openid. Кнопки SAVE внизу нет. Что я не так делаю?
@skosarev
@skosarev 3 месяца назад
Привет, в "microprofile-jwt" должен быть дефис, а не нижнее подчеркивание
@aleksey2793
@aleksey2793 2 месяца назад
А какой вариант аутентификации лучше выбрать в случае наличия трех сервисов с учетом того, что один из сервисов будет масштабироваться ввиду более высоких требований к производительности?
@shurik_codes
@shurik_codes 2 месяца назад
В условиях распределённой архитектуры я бы рассматривал OAuth/OIDC
@aleksey2793
@aleksey2793 2 месяца назад
@@shurik_codes спасибо!
@АвраамЛинкольн-н2ж
@АвраамЛинкольн-н2ж 6 месяцев назад
Доброго времени суток! Я хочу Вас, как специалиста и автора этого замечательного канала и этого нового курса, попросить совета. Я хочу найти первую работу как можно быстрее и для этого я хочу хорошо разбираться в Спринге. Я начал с курса Алишева. Но я хочу с чистой совестью говорить, что я Спринг специалист. Какая теория для этого подойдет? Ваш новый курс подойдет, для того, чтоб после него устроиться на работу?
@shurik_codes
@shurik_codes 6 месяцев назад
В этом цикле охватывается большой набор тем, но не в исчерпывающем виде, поэтому я не думаю, что его будет достаточно. Рекомендую как минимум почитать литературу по Spring, хотя бы "Spring в действии" и "Spring для профессионалов".
@АвраамЛинкольн-н2ж
@АвраамЛинкольн-н2ж 6 месяцев назад
@@shurik_codes спасибо большое!
@Hocorend
@Hocorend 4 месяца назад
58:30 Видимо чего-то не понимаю, почему после логаута он всё равно пускает и именно под учеткой j.dewar? Почему он не запрашивает логин сразу после логаута, а только при сбросе кеша, вижу только, что SessionId меняется. Это базовый логаут так своеобразно работает?
@shurik_codes
@shurik_codes 4 месяца назад
Логаут происходит только на стороне веб-приложения, но не в Keycloak, там пользователь как раз продолжает быть аутентифицированным. И в дальнейшем, при открытии страницы веб-приложения, Spring Security перенаправляет пользователя в Keycloak для получения ключа доступа, а Keycloak перенаправляет обратно в приложение. Из-за этого складывается впечатление того, что пользователь никуда и не выходил.
@Hocorend
@Hocorend 4 месяца назад
@@shurik_codes Понял, спасибо
@aleksey2793
@aleksey2793 2 месяца назад
57:00 - А если например мне необходимо сопоставить пользователя с владением набором данных в базе, например с корзиной выбранных товаров, как лучше быть? Хранить в БД товары в виде строк, где есть связка id пользователя и id товара? В таком случае с помощью OidcUserService я смогу получить этот самый id пользователя и связать его с товаром?
@shurik_codes
@shurik_codes 2 месяца назад
По хорошему должна быть таблица пользователей, специфичная для приложения, а также таблица, для связи пользователей с внешними источниками. Из OidcUser получаем идентификатор пользователя (email, username, любое свойство, идентифицирующее пользователя), по нему ищем внутреннего пользователя, а по его идентификатору уже ищем связанную с ним информацию (заказы и прочие данные)
@aleksey2793
@aleksey2793 2 месяца назад
@@shurik_codes понял, спасибо большое!
@denisskyter4526
@denisskyter4526 6 месяцев назад
Александр , вот вы используете keycloak и oAuth на клиентском приложении , т.е там где html грубо говоря , а что если у меня фронтенд вообще отдельно и его пишу даже не я , как быть? Просто писать авторизацию на spring sesecurity с jwt и в каждом эндпоинте делать проверку ?
@shurik_codes
@shurik_codes 6 месяцев назад
Яж рассказывал про это в ролике про OAuth и OIDC) Фронт - клиент (grant_type=authorization_code + pkce), бекенд - сервер ресурсов (Spring Security OAuth 2.0 Resource Server). По сути - да, фронт получает ключ доступа и отправляет его в каждом запросе к бекенду, а бекенд ключ валидирует (при помощи Spring Security)
@denisskyter4526
@denisskyter4526 6 месяцев назад
@@shurik_codes просто у вас вот используется keycloak и если при переходе на какуй то страничку человек не авторизовани его перекинет на авторизацию keycloak и вы еще в keycloak регистрировали client (manager-app) , если фронт енд отдельно , как это все реализовать , или если фронт отдельно нет необходимости так делать?
@denisskyter4526
@denisskyter4526 6 месяцев назад
@@shurik_codes а или можно просто на бекенде с помощью oAuth валидировать доступ к эндроинтам грубо говоря , что бы по /api/v1/blablabla могли обращаться только авторизованные пользователи , верно?
@shurik_codes
@shurik_codes 6 месяцев назад
Да, верно
@milordplus
@milordplus 6 месяцев назад
Спасибо за видео! Может ли кто подсказать, как экспортировать полный реалм со всеми пользователями, client-secret и тд?
@shurik_codes
@shurik_codes 6 месяцев назад
bin/kc.sh export --realm your-realm --file your-realm.json
@ИванГубарев-к4ь
@ИванГубарев-к4ь 2 месяца назад
Доброго времени суток. Может ли выскочить ошибка 403 из-за того что в папке config/keycloak/import не выгрузился realm?
@shurik_codes
@shurik_codes 2 месяца назад
Нет, если бы realm не выгрузился, то приложение не запустилось бы, т.к. параметры realm-а вычитываются при запуске приложения. При 403 ошибке обычно нужно копать в сторону CORS или CSRF
@SlevySoddik
@SlevySoddik 6 месяцев назад
Спасибо за видео! Видел практику наследования по типу: CustomUser extends UserDetails - насколько такое допустимо?
@shurik_codes
@shurik_codes 6 месяцев назад
Вполне, особенно, когда в данных о пользователе нужно иметь какие-то дополнительные свойства
@viewer_evgeniy
@viewer_evgeniy 4 месяца назад
Александр, а можете подсказать, в какую сторону двигаться, если на беке используется jwt, который клиенту отдается в теле ответа, то как это обработать с помощью RestClient? Мне нужно будет в каждый метод, где подразумевается отправка токена - добавить заголовок с соответствующим содержанием (Bearer + токен)?
@shurik_codes
@shurik_codes 4 месяца назад
Да, нужно добавлять заголовок к каждому запросу
@viewer_evgeniy
@viewer_evgeniy 4 месяца назад
Положил также кодировку пароля в мейн и заметил, что каждый раз при запуске приложения - BCrypt выдает разные значения для одного и того же пароля. Разве не должно быть всегда одинаковое значение в итоге?
@shurik_codes
@shurik_codes 4 месяца назад
Это нормально, BCrypt возвращает всякий раз новый хэш
@stanislavkuzmin8211
@stanislavkuzmin8211 4 месяца назад
Добрый день, 53.26 минута, не понятно как у Вас всё работает, если мы оставили в catalogue-service базовую аутенфикацию с ролью SERVICE, у меня вылетает ошибка 401 unauthorized, когда из manager-app вызывается restclient. Или же надо на данном этапе в catalogue-service вообще убрать spring-security?
@shurik_codes
@shurik_codes 4 месяца назад
Да, я забыл упомянуть, но ролик условно разделён на две части: первая посвящена реализации аутентификации и авторизации при помощи формы входа и локальных источников данных о пользователях, вторая (с 36:48) - о применении OAuth/OIDC. Поэтому в репозитории два коммита и тэга к этому ролику.
@ГенрихАвдеев-ь9з
@ГенрихАвдеев-ь9з 6 месяцев назад
@shurik_codes Забавный эффект получился. Перед запуском приложения был добавлен полный список прав пользователя, в т.ч. пришедших из контекста секурности спринга, но в ролике при запуске на 01:01:26 видно, что роль одна ROLE_MANAGER. Был немного обескуражен этим: вроде добавили, у меня много еще всяких скопов в ролях пользователя логе, а в ролике [ROLE_MANAGER] )).
@svyatoiambrozii
@svyatoiambrozii 5 месяцев назад
Дошел таки до запуска конфигурации и спринг выдает: 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 5 месяцев назад
Не сконфигурирован oauth2 клиент в файле свойств
@zackdd6751
@zackdd6751 5 месяцев назад
Товарищи, а лучше сам Александр)) помогите уде второй раз переписываю построчно блин. и как тоkько дохожу до oauth2, то всё время это(( Request processing failed: org.springframework.web.client.HttpClientErrorException$Unauthorized: 401 Unauthorized: [no body] Заранее Спасибо
@shurik_codes
@shurik_codes 5 месяцев назад
Слишком мало информации. 401 возвращается, когда пользователь не может быть аутентифицирован, код к ролику: github.com/alex-kosarev/sc24/tree/SC24EP04-oauth
@zackdd6751
@zackdd6751 5 месяцев назад
@@shurik_codes Извиняюсь за панику) нужно ж было досмотреть до конца таки ролик. а там вы добавили SCOPE и всё теперь можно удалять и изменять...
@НатаСметанова
@НатаСметанова 5 месяцев назад
Добрый день! Вопрос по первой части видео - вроде делаю все так же, но при запросах к 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 5 месяцев назад
401 статус говорит о том, что пользователь не аутентифицирован, причин много может быть
@svyatoiambrozii
@svyatoiambrozii 5 месяцев назад
При запуске команды выдает 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 5 месяцев назад
как выглядит выполняемая команда?
@svyatoiambrozii
@svyatoiambrozii 5 месяцев назад
@@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 5 месяцев назад
@@shurik_codes я использовал из гит репозитория как разместили.
@denisitch
@denisitch 4 месяца назад
@@svyatoiambrozii указывай абсолютный путь к папке в проекте
@svyatoiambrozii
@svyatoiambrozii 4 месяца назад
@@denisitch спасибо!)
Далее
Avaz Oxun - Yangisidan bor
14:29
Просмотров 333 тыс.
Avaz Oxun - Yangisidan bor
14:29
Просмотров 333 тыс.