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
Как же легко усваивается весь материал который вы приподносите. Спасибо вам большое, продолжайте в том же духе👍
Спасибо за урок! Для меня тема оказалась сложной, суммарно потратил часов 10, чтобы более менее со всем разобраться. Очень помогло твоё видео про OAuth и OpenID Connect.
Ставлю лайк перед просмотром, потому что знаю, что у Саши невероятный контент. Спасибо!
Саш, очередной раз спасибо за отличный контент. Тема действительно непростая. Буду пересматривать твои ролики о Keycloak и Spring Security.
Такой отличный современный материал и бесплатно - это очень благородно.
Ребят, кто может финансово поддержать, поддержите, пожалуйста, Сашин проект. Эта инвестиция вам принесет в будущем в разы больше.
А куда донатить?
нашел, отбой
Спасибо за видео, пока не осилил, похоже придется в 2-3 захода, чтобы успеть переварить инфу. Чтобы освоить урок, нужно смело выделять раза в 2-3 больше времени, чем само видео, постоянно останавливаю, пересматриваю отрывками.
Содержание урока очень насыщенное, я в платных курсах то такого не находил, обязательно потом гляну прошлые уроки тоже. Буду рекомендовать канал к просмотру!
Курс хорош. Из предложений: для каждого урока использовать свою ветку, а не коммит.
Каждый раз, настраивая базовую ауиентификацию, писал класс, имплементирующий UserDetails. Оказывается, можно без этого. Спасибо, Александр!)
Спасибо за новый урок. Отстаю немного. Загрузили на работе.
Спасибо за качественный материал.
очень приятный человек
спасибо за урок!
А зачем нужен первичный ключ id в таблице t_user_authority? Можно обойтись составным ключом id_user + id_autority?
Спасибо. Будем применять.
Круто! Очень.
Правильно ли я понял,что keyclock работает только с RestClient ,сначала авторизовываются на нем,а после посылается на сервер? Если да,то можно использовать его только на сервере, без RestClient?(просто REST API)
Это было сильно
Спасибо за урок! Сложная для меня тема, буду пересматривать и вникать, вникать и пересматривать :)
У меня вопрос: какой способ аутентификации и авторизации лучше использовать для андроид приложения, при условии что сервер самописный и приложение довольно простое(но требующее авторизации)? Сам предполагаю что JWT, но не могу подтвердить свои догадки из-за очень малого наличия информации конкретно по этой теме в интернете.
И ещё хочу сделать тебе комплимент как контент-мейкеру: только твои видео я могу смотреть не засыпая))) Видео от остальных авторов непременно убаюкивают меня уже после получаса просмотра)) Ещё раз огромное спасибо за твой труд!!
JWT - это всего лишь формат сериализации ключей доступа (по факту пользовательских сессий). На выбор есть два основных варианта: аутентификация по логину/паролю и OAuth 2.0. Если по логину и паролю, то можно использовать либо Basic-аутентификацию, но тогда придётся в каждом запросе передавать логин/пароль в заголовке Authorization, либо при помощи формы, но в этом случае нужно будет где-то хранить идентификатор HTTP-сессии, получаемый через куки. В случае с OAuth 2.0 придётся где-то хранить ключи доступа и реализовывать процесс их получения, хотя это есть в библиотеках.
58:30 Видимо чего-то не понимаю, почему после логаута он всё равно пускает и именно под учеткой j.dewar?
Почему он не запрашивает логин сразу после логаута, а только при сбросе кеша, вижу только, что SessionId меняется. Это базовый логаут так своеобразно работает?
Логаут происходит только на стороне веб-приложения, но не в Keycloak, там пользователь как раз продолжает быть аутентифицированным. И в дальнейшем, при открытии страницы веб-приложения, Spring Security перенаправляет пользователя в Keycloak для получения ключа доступа, а Keycloak перенаправляет обратно в приложение. Из-за этого складывается впечатление того, что пользователь никуда и не выходил.
@@shurik_codes Понял, спасибо
Спасибо за видео! Видел практику наследования по типу: 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).
Такая же проблема была, спасибо
Александр , вот вы используете 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 могли обращаться только авторизованные пользователи , верно?
Да, верно
Александр, а можете подсказать, в какую сторону двигаться, если на беке используется jwt, который клиенту отдается в теле ответа, то как это обработать с помощью RestClient?
Мне нужно будет в каждый метод, где подразумевается отправка токена - добавить заголовок с соответствующим содержанием (Bearer + токен)?
Да, нужно добавлять заголовок к каждому запросу
Добрый день, 53.26 минута, не понятно как у Вас всё работает, если мы оставили в catalogue-service базовую аутенфикацию с ролью SERVICE, у меня вылетает ошибка 401 unauthorized, когда из manager-app вызывается restclient. Или же надо на данном этапе в catalogue-service вообще убрать spring-security?
Да, я забыл упомянуть, но ролик условно разделён на две части: первая посвящена реализации аутентификации и авторизации при помощи формы входа и локальных источников данных о пользователях, вторая (с 36:48) - о применении OAuth/OIDC. Поэтому в репозитории два коммита и тэга к этому ролику.
Положил также кодировку пароля в мейн и заметил, что каждый раз при запуске приложения - BCrypt выдает разные значения для одного и того же пароля. Разве не должно быть всегда одинаковое значение в итоге?
Это нормально, BCrypt возвращает всякий раз новый хэш
Доброго времени суток!
Я хочу Вас, как специалиста и автора этого замечательного канала и этого нового курса, попросить совета. Я хочу найти первую работу как можно быстрее и для этого я хочу хорошо разбираться в Спринге. Я начал с курса Алишева. Но я хочу с чистой совестью говорить, что я Спринг специалист. Какая теория для этого подойдет? Ваш новый курс подойдет, для того, чтоб после него устроиться на работу?
В этом цикле охватывается большой набор тем, но не в исчерпывающем виде, поэтому я не думаю, что его будет достаточно. Рекомендую как минимум почитать литературу по Spring, хотя бы "Spring в действии" и "Spring для профессионалов".
@@shurik_codes спасибо большое!
Спасибо за видео! Может ли кто подсказать, как экспортировать полный реалм со всеми пользователями, client-secret и тд?
bin/kc.sh export --realm your-realm --file your-realm.json
Привет! Такая ошибка выскакивает. Всё настраивал по твоему видео. 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 внизу нет. Что я не так делаю?
При запуске команды выдает 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 статус говорит о том, что пользователь не аутентифицирован, причин много может быть