SC24EP04 Безопасность веб-приложений - Разработка проектов со Spring
Вставка
- Опубліковано 10 бер 2024
- Информационную систему сложно представить себе без аутентификации и авторизации - так или иначе нужно управлять доступом пользователя к тем или иным ресурсам. В четвёртом ролике серии речь пойдёт об обеспечении безопасности веб-приложения при помощи Spring Security и будет продемонстрирована настройка цепочки фильтров безопасности. В рамках ролика демонстрируется использование формы входа, Basic-аутентификации и применение OAuth 2.0/OpenID Connect.
В цикле роликов "Разработка проектов со Spring" я рассказываю на простых примерах о процессе разработки веб-приложений и REST-сервисов на языке программирования Java с использованием экосистемы Spring. Данный цикл охватывает разработку классических и реактивных проектов, вопросы их сопровождения, такие как документация и мониторинг, адаптацию их к облачной инфраструктуре и процесс их развёртывания в Docker и Kubernetes.
Репозиторий проекта: github.com/alex-kosarev/sc24/...
Мои ресурсы:
- Сайт: alexkosarev.name
- Канал на UA-cam: / @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
Топчик, спасибо!
Как же легко усваивается весь материал который вы приподносите. Спасибо вам большое, продолжайте в том же духе👍
Спасибо за урок! Для меня тема оказалась сложной, суммарно потратил часов 10, чтобы более менее со всем разобраться. Очень помогло твоё видео про OAuth и OpenID Connect.
Ставлю лайк перед просмотром, потому что знаю, что у Саши невероятный контент. Спасибо!
Саш, очередной раз спасибо за отличный контент. Тема действительно непростая. Буду пересматривать твои ролики о Keycloak и Spring Security.
Такой отличный современный материал и бесплатно - это очень благородно.
Ребят, кто может финансово поддержать, поддержите, пожалуйста, Сашин проект. Эта инвестиция вам принесет в будущем в разы больше.
А куда донатить?
нашел, отбой
Каждый раз, настраивая базовую ауиентификацию, писал класс, имплементирующий UserDetails. Оказывается, можно без этого. Спасибо, Александр!)
Курс хорош. Из предложений: для каждого урока использовать свою ветку, а не коммит.
Спасибо за новый урок. Отстаю немного. Загрузили на работе.
Спасибо за видео, пока не осилил, похоже придется в 2-3 захода, чтобы успеть переварить инфу. Чтобы освоить урок, нужно смело выделять раза в 2-3 больше времени, чем само видео, постоянно останавливаю, пересматриваю отрывками.
Содержание урока очень насыщенное, я в платных курсах то такого не находил, обязательно потом гляну прошлые уроки тоже. Буду рекомендовать канал к просмотру!
Спасибо за качественный материал.
спасибо за урок!
очень приятный человек
Спасибо. Будем применять.
Круто! Очень.
А зачем нужен первичный ключ id в таблице t_user_authority? Можно обойтись составным ключом id_user + id_autority?
Это было сильно
Спасибо за урок! Сложная для меня тема, буду пересматривать и вникать, вникать и пересматривать :)
У меня вопрос: какой способ аутентификации и авторизации лучше использовать для андроид приложения, при условии что сервер самописный и приложение довольно простое(но требующее авторизации)? Сам предполагаю что JWT, но не могу подтвердить свои догадки из-за очень малого наличия информации конкретно по этой теме в интернете.
И ещё хочу сделать тебе комплимент как контент-мейкеру: только твои видео я могу смотреть не засыпая))) Видео от остальных авторов непременно убаюкивают меня уже после получаса просмотра)) Ещё раз огромное спасибо за твой труд!!
JWT - это всего лишь формат сериализации ключей доступа (по факту пользовательских сессий). На выбор есть два основных варианта: аутентификация по логину/паролю и OAuth 2.0. Если по логину и паролю, то можно использовать либо Basic-аутентификацию, но тогда придётся в каждом запросе передавать логин/пароль в заголовке Authorization, либо при помощи формы, но в этом случае нужно будет где-то хранить идентификатор HTTP-сессии, получаемый через куки. В случае с OAuth 2.0 придётся где-то хранить ключи доступа и реализовывать процесс их получения, хотя это есть в библиотеках.
Спасибо за видео! Видел практику наследования по типу: CustomUser extends UserDetails - насколько такое допустимо?
Вполне, особенно, когда в данных о пользователе нужно иметь какие-то дополнительные свойства
Столкнулся с тем, что после добавления секурности в catalogue-service (около 12 минуты ролика), запросы на изменение возвращают 500, а внутри manager-app в логах пишется 401. При этом запросы на получение информации (списки, данные по продукту) выполняются нормально.
Странно, точно 401, а не 403? Если 403, то не отключён фильтр CSRF на стороне catalogue-service
@@shurik_codesВозвращает 401, возможно это как-то связано с обработкой ошибок в manager-app. Но обратил внимание, что для таких запросов прокидывается csrf информация в запросе. После того как отключил в конфиге безопасности csrf, стали запросы корректно проходить.
аналогично
У меня тоже такое было. Просто отключил csrf фильтр в security config - http
.csrf(AbstractHttpConfigurer::disable).
Такая же проблема была, спасибо
Правильно ли я понял,что keyclock работает только с RestClient ,сначала авторизовываются на нем,а после посылается на сервер? Если да,то можно использовать его только на сервере, без RestClient?(просто REST API)
Александр , вот вы используете keycloak и oAuth на клиентском приложении , т.е там где html грубо говоря , а что если у меня фронтенд вообще отдельно и его пишу даже не я , как быть? Просто писать авторизацию на spring sesecurity с jwt и в каждом эндпоинте делать проверку ?
Яж рассказывал про это в ролике про OAuth и OIDC) Фронт - клиент (grant_type=authorization_code + pkce), бекенд - сервер ресурсов (Spring Security OAuth 2.0 Resource Server). По сути - да, фронт получает ключ доступа и отправляет его в каждом запросе к бекенду, а бекенд ключ валидирует (при помощи Spring Security)
@@shurik_codes просто у вас вот используется keycloak и если при переходе на какуй то страничку человек не авторизовани его перекинет на авторизацию keycloak и вы еще в keycloak регистрировали client (manager-app) , если фронт енд отдельно , как это все реализовать , или если фронт отдельно нет необходимости так делать?
@@shurik_codes а или можно просто на бекенде с помощью oAuth валидировать доступ к эндроинтам грубо говоря , что бы по /api/v1/blablabla могли обращаться только авторизованные пользователи , верно?
Да, верно
58:30 Видимо чего-то не понимаю, почему после логаута он всё равно пускает и именно под учеткой j.dewar?
Почему он не запрашивает логин сразу после логаута, а только при сбросе кеша, вижу только, что SessionId меняется. Это базовый логаут так своеобразно работает?
Логаут происходит только на стороне веб-приложения, но не в Keycloak, там пользователь как раз продолжает быть аутентифицированным. И в дальнейшем, при открытии страницы веб-приложения, Spring Security перенаправляет пользователя в Keycloak для получения ключа доступа, а Keycloak перенаправляет обратно в приложение. Из-за этого складывается впечатление того, что пользователь никуда и не выходил.
@@shurik_codes Понял, спасибо
Спасибо за видео! Может ли кто подсказать, как экспортировать полный реалм со всеми пользователями, client-secret и тд?
bin/kc.sh export --realm your-realm --file your-realm.json
Александр, а можете подсказать, в какую сторону двигаться, если на беке используется jwt, который клиенту отдается в теле ответа, то как это обработать с помощью RestClient?
Мне нужно будет в каждый метод, где подразумевается отправка токена - добавить заголовок с соответствующим содержанием (Bearer + токен)?
Да, нужно добавлять заголовок к каждому запросу
Доброго времени суток!
Я хочу Вас, как специалиста и автора этого замечательного канала и этого нового курса, попросить совета. Я хочу найти первую работу как можно быстрее и для этого я хочу хорошо разбираться в Спринге. Я начал с курса Алишева. Но я хочу с чистой совестью говорить, что я Спринг специалист. Какая теория для этого подойдет? Ваш новый курс подойдет, для того, чтоб после него устроиться на работу?
В этом цикле охватывается большой набор тем, но не в исчерпывающем виде, поэтому я не думаю, что его будет достаточно. Рекомендую как минимум почитать литературу по Spring, хотя бы "Spring в действии" и "Spring для профессионалов".
@@shurik_codes спасибо большое!
Положил также кодировку пароля в мейн и заметил, что каждый раз при запуске приложения - BCrypt выдает разные значения для одного и того же пароля. Разве не должно быть всегда одинаковое значение в итоге?
Это нормально, BCrypt возвращает всякий раз новый хэш
Добрый день, 53.26 минута, не понятно как у Вас всё работает, если мы оставили в catalogue-service базовую аутенфикацию с ролью SERVICE, у меня вылетает ошибка 401 unauthorized, когда из manager-app вызывается restclient. Или же надо на данном этапе в catalogue-service вообще убрать spring-security?
Да, я забыл упомянуть, но ролик условно разделён на две части: первая посвящена реализации аутентификации и авторизации при помощи формы входа и локальных источников данных о пользователях, вторая (с 36:48) - о применении OAuth/OIDC. Поэтому в репозитории два коммита и тэга к этому ролику.
Привет! Такая ошибка выскакивает. Всё настраивал по твоему видео. Login with OAuth 2.0
[invalid_scope] Invalid scopes: openid view_catalogue edit_catalogue microprofile_jwt
Значит в клиент на стороне Keycloak не добавлены указанные скоупы, их можно посмотреть в настройках клиента
@@shurik_codes Я их добавил в Client -> Client Scopes -> Evaluate, выбрал User j.dewar. Generated access token всё как у тебя. Но scopes там почему-то не сохраняются. Перезагружаю страницу и всё пропадает, остаётся только openid. Кнопки SAVE внизу нет. Что я не так делаю?
Привет, в "microprofile-jwt" должен быть дефис, а не нижнее подчеркивание
При запуске команды выдает 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 Выполняю именно как Вы в видео 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
а потом так же повторяю команду.
@@shurik_codes я использовал из гит репозитория как разместили.
@@svyatoiambrozii указывай абсолютный путь к папке в проекте
@@denisitch спасибо!)
@shurik_codes
Забавный эффект получился. Перед запуском приложения был добавлен полный список прав пользователя, в т.ч. пришедших из контекста секурности спринга, но в ролике при запуске на 01:01:26 видно, что роль одна ROLE_MANAGER.
Был немного обескуражен этим: вроде добавили, у меня много еще всяких скопов в ролях пользователя логе, а в ролике [ROLE_MANAGER] )).
Дошел таки до запуска конфигурации и спринг выдает: 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
Не сконфигурирован oauth2 клиент в файле свойств
Товарищи, а лучше сам Александр)) помогите уде второй раз переписываю построчно блин. и как тоkько дохожу до oauth2, то всё время это((
Request processing failed: org.springframework.web.client.HttpClientErrorException$Unauthorized: 401 Unauthorized: [no body]
Заранее Спасибо
Слишком мало информации. 401 возвращается, когда пользователь не может быть аутентифицирован, код к ролику: github.com/alex-kosarev/sc24/tree/SC24EP04-oauth
@@shurik_codes Извиняюсь за панику) нужно ж было досмотреть до конца таки ролик. а там вы добавили SCOPE и всё теперь можно удалять и изменять...
Добрый день! Вопрос по первой части видео - вроде делаю все так же, но при запросах к 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 уже пробовала)
401 статус говорит о том, что пользователь не аутентифицирован, причин много может быть