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

  Рет қаралды 9,281

Уголок сельского джависта

Уголок сельского джависта

Күн бұрын

Информационную систему сложно представить себе без аутентификации и авторизации - так или иначе нужно управлять доступом пользователя к тем или иным ресурсам. В четвёртом ролике серии речь пойдёт об обеспечении безопасности веб-приложения при помощи Spring Security и будет продемонстрирована настройка цепочки фильтров безопасности. В рамках ролика демонстрируется использование формы входа, Basic-аутентификации и применение OAuth 2.0/OpenID Connect.
В цикле роликов "Разработка проектов со Spring" я рассказываю на простых примерах о процессе разработки веб-приложений и REST-сервисов на языке программирования Java с использованием экосистемы Spring. Данный цикл охватывает разработку классических и реактивных проектов, вопросы их сопровождения, такие как документация и мониторинг, адаптацию их к облачной инфраструктуре и процесс их развёртывания в Docker и Kubernetes.
Репозиторий проекта: github.com/ale...
Мои ресурсы:
- Сайт: alexkosarev.name
- Канал на KZbin: / @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

Пікірлер: 84
@АязЛотфуллин
@АязЛотфуллин 4 ай бұрын
Как же легко усваивается весь материал который вы приподносите. Спасибо вам большое, продолжайте в том же духе👍
@Devivl
@Devivl 6 ай бұрын
Саш, очередной раз спасибо за отличный контент. Тема действительно непростая. Буду пересматривать твои ролики о Keycloak и Spring Security. Такой отличный современный материал и бесплатно - это очень благородно. Ребят, кто может финансово поддержать, поддержите, пожалуйста, Сашин проект. Эта инвестиция вам принесет в будущем в разы больше.
@zackdd6751
@zackdd6751 6 ай бұрын
А куда донатить?
@zackdd6751
@zackdd6751 6 ай бұрын
нашел, отбой
@urantech
@urantech 6 ай бұрын
Ставлю лайк перед просмотром, потому что знаю, что у Саши невероятный контент. Спасибо!
@denisthestudent
@denisthestudent 4 ай бұрын
Спасибо за урок! Для меня тема оказалась сложной, суммарно потратил часов 10, чтобы более менее со всем разобраться. Очень помогло твоё видео про OAuth и OpenID Connect.
@ЕвгенийАлексеев-о9э
@ЕвгенийАлексеев-о9э 6 ай бұрын
Каждый раз, настраивая базовую ауиентификацию, писал класс, имплементирующий UserDetails. Оказывается, можно без этого. Спасибо, Александр!)
@hurricane-rus
@hurricane-rus 2 ай бұрын
Спасибо за видео! Тут конечно взрыв мозга, без личной практики невозможно разобраться)
@ВладимирБутков-э5э
@ВладимирБутков-э5э 3 ай бұрын
Спасибо огромное за такую полезную информацию.
@АлександрТяпкин-п2ц
@АлександрТяпкин-п2ц 6 ай бұрын
Спасибо за новый урок. Отстаю немного. Загрузили на работе.
@Константин-ы9к
@Константин-ы9к 5 ай бұрын
Спасибо за качественный материал.
@sermaz-blg
@sermaz-blg 5 ай бұрын
Курс хорош. Из предложений: для каждого урока использовать свою ветку, а не коммит.
@zigyias347
@zigyias347 5 ай бұрын
очень приятный человек
@Admin-qw7ss
@Admin-qw7ss 6 ай бұрын
спасибо за урок!
@Hocorend
@Hocorend 4 ай бұрын
Спасибо за видео, пока не осилил, похоже придется в 2-3 захода, чтобы успеть переварить инфу. Чтобы освоить урок, нужно смело выделять раза в 2-3 больше времени, чем само видео, постоянно останавливаю, пересматриваю отрывками. Содержание урока очень насыщенное, я в платных курсах то такого не находил, обязательно потом гляну прошлые уроки тоже. Буду рекомендовать канал к просмотру!
@dmaberlin
@dmaberlin 3 ай бұрын
Топчик, спасибо!
@Boraldan
@Boraldan 5 ай бұрын
Спасибо. Будем применять.
@levaryazan
@levaryazan 6 ай бұрын
Круто! Очень.
@raingor
@raingor 2 ай бұрын
Кстати, вот что заметил. До 13:40 где ты проверял межсервисное общение, ты проверил только get к страничке и листу. Я повторив секьюр такой же заметил, что если попытаться создать что то , то выдаст 401. Хрен его знает почему, но вот так вот-
@redrikshuhard247
@redrikshuhard247 Ай бұрын
У меня тоже проходят только get обращения, а сделать какие либо изменения (post, patch и delete) выдают 401. Но в комментариях ниже есть решение
@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 придётся где-то хранить ключи доступа и реализовывать процесс их получения, хотя это есть в библиотеках.
@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 ай бұрын
Да, верно
@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" должен быть дефис, а не нижнее подчеркивание
@АвраамЛинкольн-н2ж
@АвраамЛинкольн-н2ж 6 ай бұрын
Доброго времени суток! Я хочу Вас, как специалиста и автора этого замечательного канала и этого нового курса, попросить совета. Я хочу найти первую работу как можно быстрее и для этого я хочу хорошо разбираться в Спринге. Я начал с курса Алишева. Но я хочу с чистой совестью говорить, что я Спринг специалист. Какая теория для этого подойдет? Ваш новый курс подойдет, для того, чтоб после него устроиться на работу?
@shurik_codes
@shurik_codes 6 ай бұрын
В этом цикле охватывается большой набор тем, но не в исчерпывающем виде, поэтому я не думаю, что его будет достаточно. Рекомендую как минимум почитать литературу по Spring, хотя бы "Spring в действии" и "Spring для профессионалов".
@АвраамЛинкольн-н2ж
@АвраамЛинкольн-н2ж 6 ай бұрын
@@shurik_codes спасибо большое!
@aleksey2793
@aleksey2793 Ай бұрын
А какой вариант аутентификации лучше выбрать в случае наличия трех сервисов с учетом того, что один из сервисов будет масштабироваться ввиду более высоких требований к производительности?
@shurik_codes
@shurik_codes Ай бұрын
В условиях распределённой архитектуры я бы рассматривал OAuth/OIDC
@aleksey2793
@aleksey2793 Ай бұрын
@@shurik_codes спасибо!
@denis-3
@denis-3 3 ай бұрын
Правильно ли я понял,что keyclock работает только с RestClient ,сначала авторизовываются на нем,а после посылается на сервер? Если да,то можно использовать его только на сервере, без RestClient?(просто REST API)
@Hocorend
@Hocorend 4 ай бұрын
58:30 Видимо чего-то не понимаю, почему после логаута он всё равно пускает и именно под учеткой j.dewar? Почему он не запрашивает логин сразу после логаута, а только при сбросе кеша, вижу только, что SessionId меняется. Это базовый логаут так своеобразно работает?
@shurik_codes
@shurik_codes 4 ай бұрын
Логаут происходит только на стороне веб-приложения, но не в Keycloak, там пользователь как раз продолжает быть аутентифицированным. И в дальнейшем, при открытии страницы веб-приложения, Spring Security перенаправляет пользователя в Keycloak для получения ключа доступа, а Keycloak перенаправляет обратно в приложение. Из-за этого складывается впечатление того, что пользователь никуда и не выходил.
@Hocorend
@Hocorend 4 ай бұрын
@@shurik_codes Понял, спасибо
@SlevySoddik
@SlevySoddik 6 ай бұрын
Спасибо за видео! Видел практику наследования по типу: CustomUser extends UserDetails - насколько такое допустимо?
@shurik_codes
@shurik_codes 6 ай бұрын
Вполне, особенно, когда в данных о пользователе нужно иметь какие-то дополнительные свойства
@viewer_evgeniy
@viewer_evgeniy 4 ай бұрын
Александр, а можете подсказать, в какую сторону двигаться, если на беке используется jwt, который клиенту отдается в теле ответа, то как это обработать с помощью RestClient? Мне нужно будет в каждый метод, где подразумевается отправка токена - добавить заголовок с соответствующим содержанием (Bearer + токен)?
@shurik_codes
@shurik_codes 4 ай бұрын
Да, нужно добавлять заголовок к каждому запросу
@ИванГубарев-к4ь
@ИванГубарев-к4ь 2 ай бұрын
Доброго времени суток. Может ли выскочить ошибка 403 из-за того что в папке config/keycloak/import не выгрузился realm?
@shurik_codes
@shurik_codes Ай бұрын
Нет, если бы realm не выгрузился, то приложение не запустилось бы, т.к. параметры realm-а вычитываются при запуске приложения. При 403 ошибке обычно нужно копать в сторону CORS или CSRF
@aleksey2793
@aleksey2793 Ай бұрын
57:00 - А если например мне необходимо сопоставить пользователя с владением набором данных в базе, например с корзиной выбранных товаров, как лучше быть? Хранить в БД товары в виде строк, где есть связка id пользователя и id товара? В таком случае с помощью OidcUserService я смогу получить этот самый id пользователя и связать его с товаром?
@shurik_codes
@shurik_codes Ай бұрын
По хорошему должна быть таблица пользователей, специфичная для приложения, а также таблица, для связи пользователей с внешними источниками. Из OidcUser получаем идентификатор пользователя (email, username, любое свойство, идентифицирующее пользователя), по нему ищем внутреннего пользователя, а по его идентификатору уже ищем связанную с ним информацию (заказы и прочие данные)
@aleksey2793
@aleksey2793 Ай бұрын
@@shurik_codes понял, спасибо большое!
@milordplus
@milordplus 6 ай бұрын
Спасибо за видео! Может ли кто подсказать, как экспортировать полный реалм со всеми пользователями, client-secret и тд?
@shurik_codes
@shurik_codes 6 ай бұрын
bin/kc.sh export --realm your-realm --file your-realm.json
@viewer_evgeniy
@viewer_evgeniy 4 ай бұрын
Положил также кодировку пароля в мейн и заметил, что каждый раз при запуске приложения - BCrypt выдает разные значения для одного и того же пароля. Разве не должно быть всегда одинаковое значение в итоге?
@shurik_codes
@shurik_codes 4 ай бұрын
Это нормально, BCrypt возвращает всякий раз новый хэш
@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. Поэтому в репозитории два коммита и тэга к этому ролику.
@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 4 ай бұрын
как выглядит выполняемая команда?
@svyatoiambrozii
@svyatoiambrozii 4 ай бұрын
@@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 4 ай бұрын
@@shurik_codes я использовал из гит репозитория как разместили.
@denisitch
@denisitch 4 ай бұрын
@@svyatoiambrozii указывай абсолютный путь к папке в проекте
@svyatoiambrozii
@svyatoiambrozii 4 ай бұрын
@@denisitch спасибо!)
@ГенрихАвдеев-ь9з
@ГенрихАвдеев-ь9з 6 ай бұрын
@shurik_codes Забавный эффект получился. Перед запуском приложения был добавлен полный список прав пользователя, в т.ч. пришедших из контекста секурности спринга, но в ролике при запуске на 01:01:26 видно, что роль одна ROLE_MANAGER. Был немного обескуражен этим: вроде добавили, у меня много еще всяких скопов в ролях пользователя логе, а в ролике [ROLE_MANAGER] )).
@svyatoiambrozii
@svyatoiambrozii 4 ай бұрын
Дошел таки до запуска конфигурации и спринг выдает: 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 4 ай бұрын
Не сконфигурирован 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 статус говорит о том, что пользователь не аутентифицирован, причин много может быть
Keycloak и Spring Security
37:37
Уголок сельского джависта
Рет қаралды 13 М.
An Unknown Ending💪
00:49
ISSEI / いっせい
Рет қаралды 52 МЛН
Brawl Stars Edit😈📕
00:15
Kan Andrey
Рет қаралды 50 МЛН
Will A Guitar Boat Hold My Weight?
00:20
MrBeast
Рет қаралды 216 МЛН
SC24EP02 Разработка REST-сервиса - Разработка проектов со Spring #java #spring #rest
1:06:16
Основы OAuth 2.0 и OpenID Connect #oauth #oidc #openidconnect
1:10:17
Уголок сельского джависта
Рет қаралды 9 М.
An Unknown Ending💪
00:49
ISSEI / いっせい
Рет қаралды 52 МЛН