Саш, очередной раз спасибо за отличный контент. Тема действительно непростая. Буду пересматривать твои ролики о Keycloak и Spring Security. Такой отличный современный материал и бесплатно - это очень благородно. Ребят, кто может финансово поддержать, поддержите, пожалуйста, Сашин проект. Эта инвестиция вам принесет в будущем в разы больше.
@zackdd675110 ай бұрын
А куда донатить?
@zackdd675110 ай бұрын
нашел, отбой
@urantech10 ай бұрын
Ставлю лайк перед просмотром, потому что знаю, что у Саши невероятный контент. Спасибо!
@ЕвгенийАлексеев-о9э10 ай бұрын
Каждый раз, настраивая базовую ауиентификацию, писал класс, имплементирующий UserDetails. Оказывается, можно без этого. Спасибо, Александр!)
@Константин-ы9к10 ай бұрын
Спасибо за качественный материал.
@АлександрТяпкин-п2ц10 ай бұрын
Спасибо за новый урок. Отстаю немного. Загрузили на работе.
@АязЛотфуллин8 ай бұрын
Как же легко усваивается весь материал который вы приподносите. Спасибо вам большое, продолжайте в том же духе👍
@hurricane-rus7 ай бұрын
Спасибо за видео! Тут конечно взрыв мозга, без личной практики невозможно разобраться)
@denisthestudent8 ай бұрын
Спасибо за урок! Для меня тема оказалась сложной, суммарно потратил часов 10, чтобы более менее со всем разобраться. Очень помогло твоё видео про OAuth и OpenID Connect.
@МихаилМихаил-ф7у3 ай бұрын
Огромное спасибо за ролики. Очень полезно.
@zigyias3479 ай бұрын
очень приятный человек
@Hocorend8 ай бұрын
Спасибо за видео, пока не осилил, похоже придется в 2-3 захода, чтобы успеть переварить инфу. Чтобы освоить урок, нужно смело выделять раза в 2-3 больше времени, чем само видео, постоянно останавливаю, пересматриваю отрывками. Содержание урока очень насыщенное, я в платных курсах то такого не находил, обязательно потом гляну прошлые уроки тоже. Буду рекомендовать канал к просмотру!
@ВладимирБутков-э5э7 ай бұрын
Спасибо огромное за такую полезную информацию.
@Admin-qw7ss10 ай бұрын
спасибо за урок!
@Boraldan9 ай бұрын
Спасибо. Будем применять.
@user-kuzya202310 күн бұрын
Привет! Про crf атаки ты рассказываешь -> "Аутентификация - Spring Security в деталях"?
@vladyslavhasporian2934Ай бұрын
thanks
@ГенрихАвдеев-ь9з10 ай бұрын
Столкнулся с тем, что после добавления секурности в catalogue-service (около 12 минуты ролика), запросы на изменение возвращают 500, а внутри manager-app в логах пишется 401. При этом запросы на получение информации (списки, данные по продукту) выполняются нормально.
@shurik_codes10 ай бұрын
Странно, точно 401, а не 403? Если 403, то не отключён фильтр CSRF на стороне catalogue-service
@ГенрихАвдеев-ь9з10 ай бұрын
@@shurik_codesВозвращает 401, возможно это как-то связано с обработкой ошибок в manager-app. Но обратил внимание, что для таких запросов прокидывается csrf информация в запросе. После того как отключил в конфиге безопасности csrf, стали запросы корректно проходить.
@Papont8 ай бұрын
аналогично
@ausq_cypher8 ай бұрын
У меня тоже такое было. Просто отключил csrf фильтр в security config - http .csrf(AbstractHttpConfigurer::disable).
@Hocorend8 ай бұрын
Такая же проблема была, спасибо
@sermaz-blg9 ай бұрын
Курс хорош. Из предложений: для каждого урока использовать свою ветку, а не коммит.
@raingor6 ай бұрын
Кстати, вот что заметил. До 13:40 где ты проверял межсервисное общение, ты проверил только get к страничке и листу. Я повторив секьюр такой же заметил, что если попытаться создать что то , то выдаст 401. Хрен его знает почему, но вот так вот-
@redrikshuhard2476 ай бұрын
У меня тоже проходят только get обращения, а сделать какие либо изменения (post, patch и delete) выдают 401. Но в комментариях ниже есть решение
@kowalski188810 ай бұрын
Спасибо за урок! Сложная для меня тема, буду пересматривать и вникать, вникать и пересматривать :) У меня вопрос: какой способ аутентификации и авторизации лучше использовать для андроид приложения, при условии что сервер самописный и приложение довольно простое(но требующее авторизации)? Сам предполагаю что JWT, но не могу подтвердить свои догадки из-за очень малого наличия информации конкретно по этой теме в интернете. И ещё хочу сделать тебе комплимент как контент-мейкеру: только твои видео я могу смотреть не засыпая))) Видео от остальных авторов непременно убаюкивают меня уже после получаса просмотра)) Ещё раз огромное спасибо за твой труд!!
@shurik_codes10 ай бұрын
JWT - это всего лишь формат сериализации ключей доступа (по факту пользовательских сессий). На выбор есть два основных варианта: аутентификация по логину/паролю и OAuth 2.0. Если по логину и паролю, то можно использовать либо Basic-аутентификацию, но тогда придётся в каждом запросе передавать логин/пароль в заголовке Authorization, либо при помощи формы, но в этом случае нужно будет где-то хранить идентификатор HTTP-сессии, получаемый через куки. В случае с OAuth 2.0 придётся где-то хранить ключи доступа и реализовывать процесс их получения, хотя это есть в библиотеках.
@levaryazan10 ай бұрын
Круто! Очень.
@Hocorend8 ай бұрын
58:30 Видимо чего-то не понимаю, почему после логаута он всё равно пускает и именно под учеткой j.dewar? Почему он не запрашивает логин сразу после логаута, а только при сбросе кеша, вижу только, что SessionId меняется. Это базовый логаут так своеобразно работает?
@shurik_codes8 ай бұрын
Логаут происходит только на стороне веб-приложения, но не в Keycloak, там пользователь как раз продолжает быть аутентифицированным. И в дальнейшем, при открытии страницы веб-приложения, Spring Security перенаправляет пользователя в Keycloak для получения ключа доступа, а Keycloak перенаправляет обратно в приложение. Из-за этого складывается впечатление того, что пользователь никуда и не выходил.
@Hocorend8 ай бұрын
@@shurik_codes Понял, спасибо
@dmaberlin7 ай бұрын
Топчик, спасибо!
@denisskyter452610 ай бұрын
Александр , вот вы используете keycloak и oAuth на клиентском приложении , т.е там где html грубо говоря , а что если у меня фронтенд вообще отдельно и его пишу даже не я , как быть? Просто писать авторизацию на spring sesecurity с jwt и в каждом эндпоинте делать проверку ?
@shurik_codes10 ай бұрын
Яж рассказывал про это в ролике про OAuth и OIDC) Фронт - клиент (grant_type=authorization_code + pkce), бекенд - сервер ресурсов (Spring Security OAuth 2.0 Resource Server). По сути - да, фронт получает ключ доступа и отправляет его в каждом запросе к бекенду, а бекенд ключ валидирует (при помощи Spring Security)
@denisskyter452610 ай бұрын
@@shurik_codes просто у вас вот используется keycloak и если при переходе на какуй то страничку человек не авторизовани его перекинет на авторизацию keycloak и вы еще в keycloak регистрировали client (manager-app) , если фронт енд отдельно , как это все реализовать , или если фронт отдельно нет необходимости так делать?
@denisskyter452610 ай бұрын
@@shurik_codes а или можно просто на бекенде с помощью oAuth валидировать доступ к эндроинтам грубо говоря , что бы по /api/v1/blablabla могли обращаться только авторизованные пользователи , верно?
@shurik_codes10 ай бұрын
Да, верно
@МихаилМихаил-ф7у28 күн бұрын
Добрый день, был бы очень благодарен если бы рассказал, как экспортировать realms с юзерам. Так как череp UI скачивается без юзеров, а когда пытаюсь стянуть конфиг из докера по пути /opt/keycloak/data/import то там не обновляются новые юзеры. Спасибо!
@goodvideobro10 ай бұрын
Это было сильно
@denis-38 ай бұрын
Правильно ли я понял,что keyclock работает только с RestClient ,сначала авторизовываются на нем,а после посылается на сервер? Если да,то можно использовать его только на сервере, без RestClient?(просто REST API)
@АвраамЛинкольн-н2ж10 ай бұрын
Доброго времени суток! Я хочу Вас, как специалиста и автора этого замечательного канала и этого нового курса, попросить совета. Я хочу найти первую работу как можно быстрее и для этого я хочу хорошо разбираться в Спринге. Я начал с курса Алишева. Но я хочу с чистой совестью говорить, что я Спринг специалист. Какая теория для этого подойдет? Ваш новый курс подойдет, для того, чтоб после него устроиться на работу?
@shurik_codes10 ай бұрын
В этом цикле охватывается большой набор тем, но не в исчерпывающем виде, поэтому я не думаю, что его будет достаточно. Рекомендую как минимум почитать литературу по Spring, хотя бы "Spring в действии" и "Spring для профессионалов".
@АвраамЛинкольн-н2ж10 ай бұрын
@@shurik_codes спасибо большое!
@aleksey27936 ай бұрын
57:00 - А если например мне необходимо сопоставить пользователя с владением набором данных в базе, например с корзиной выбранных товаров, как лучше быть? Хранить в БД товары в виде строк, где есть связка id пользователя и id товара? В таком случае с помощью OidcUserService я смогу получить этот самый id пользователя и связать его с товаром?
@shurik_codes6 ай бұрын
По хорошему должна быть таблица пользователей, специфичная для приложения, а также таблица, для связи пользователей с внешними источниками. Из OidcUser получаем идентификатор пользователя (email, username, любое свойство, идентифицирующее пользователя), по нему ищем внутреннего пользователя, а по его идентификатору уже ищем связанную с ним информацию (заказы и прочие данные)
@aleksey27936 ай бұрын
@@shurik_codes понял, спасибо большое!
@aleksey27936 ай бұрын
А какой вариант аутентификации лучше выбрать в случае наличия трех сервисов с учетом того, что один из сервисов будет масштабироваться ввиду более высоких требований к производительности?
@shurik_codes6 ай бұрын
В условиях распределённой архитектуры я бы рассматривал OAuth/OIDC
@aleksey27936 ай бұрын
@@shurik_codes спасибо!
@SlevySoddik10 ай бұрын
Спасибо за видео! Видел практику наследования по типу: CustomUser extends UserDetails - насколько такое допустимо?
@shurik_codes10 ай бұрын
Вполне, особенно, когда в данных о пользователе нужно иметь какие-то дополнительные свойства
@viewer_evgeniy8 ай бұрын
Александр, а можете подсказать, в какую сторону двигаться, если на беке используется jwt, который клиенту отдается в теле ответа, то как это обработать с помощью RestClient? Мне нужно будет в каждый метод, где подразумевается отправка токена - добавить заголовок с соответствующим содержанием (Bearer + токен)?
@shurik_codes8 ай бұрын
Да, нужно добавлять заголовок к каждому запросу
@bolekrus8 ай бұрын
Привет! Такая ошибка выскакивает. Всё настраивал по твоему видео. Login with OAuth 2.0 [invalid_scope] Invalid scopes: openid view_catalogue edit_catalogue microprofile_jwt
@shurik_codes8 ай бұрын
Значит в клиент на стороне Keycloak не добавлены указанные скоупы, их можно посмотреть в настройках клиента
@bolekrus8 ай бұрын
@@shurik_codes Я их добавил в Client -> Client Scopes -> Evaluate, выбрал User j.dewar. Generated access token всё как у тебя. Но scopes там почему-то не сохраняются. Перезагружаю страницу и всё пропадает, остаётся только openid. Кнопки SAVE внизу нет. Что я не так делаю?
@skosarev7 ай бұрын
Привет, в "microprofile-jwt" должен быть дефис, а не нижнее подчеркивание
@СанчоПанса-ч9й2 ай бұрын
@@skosarev проблема в том, что скоупы не сохраняются
@ГенрихАвдеев-ь9з10 ай бұрын
@shurik_codes Забавный эффект получился. Перед запуском приложения был добавлен полный список прав пользователя, в т.ч. пришедших из контекста секурности спринга, но в ролике при запуске на 01:01:26 видно, что роль одна ROLE_MANAGER. Был немного обескуражен этим: вроде добавили, у меня много еще всяких скопов в ролях пользователя логе, а в ролике [ROLE_MANAGER] )).
@odtour4 ай бұрын
Надо было всё же разделить ролик. Начиная с 51:00 перестало работать.
@shurik_codes4 ай бұрын
Значит, надо внимательнее смотреть ролик и репозиторий проекта, код на 100% рабочий. Единственный момент, который я не упомянул в ролике (вроде) - что OAuth настраивается вместо Basic-аутентификации
@odtour3 ай бұрын
@@shurik_codes ну вот мне, например, не понятно, как именно там перенастроено, начиная с 46:10
@shurik_codes3 ай бұрын
@@odtour проект просто возвращён к состоянию на начало ролика, я как-то в ролике забыл это сказать
@milordplus10 ай бұрын
Спасибо за видео! Может ли кто подсказать, как экспортировать полный реалм со всеми пользователями, client-secret и тд?
Такой scratch файл можно сделать только в Ultimate версии?
@shurik_codes4 ай бұрын
java-скрэтчи можно создавать и в Community Edition
@viewer_evgeniy8 ай бұрын
Положил также кодировку пароля в мейн и заметил, что каждый раз при запуске приложения - BCrypt выдает разные значения для одного и того же пароля. Разве не должно быть всегда одинаковое значение в итоге?
@shurik_codes8 ай бұрын
Это нормально, BCrypt возвращает всякий раз новый хэш
@stanislavkuzmin82118 ай бұрын
Добрый день, 53.26 минута, не понятно как у Вас всё работает, если мы оставили в catalogue-service базовую аутенфикацию с ролью SERVICE, у меня вылетает ошибка 401 unauthorized, когда из manager-app вызывается restclient. Или же надо на данном этапе в catalogue-service вообще убрать spring-security?
@shurik_codes8 ай бұрын
Да, я забыл упомянуть, но ролик условно разделён на две части: первая посвящена реализации аутентификации и авторизации при помощи формы входа и локальных источников данных о пользователях, вторая (с 36:48) - о применении OAuth/OIDC. Поэтому в репозитории два коммита и тэга к этому ролику.
@СергейЗаря-х9ь4 ай бұрын
добрый день, подключил бд через пг admin, все работает. Но я не могу изменить порт с 5432 на 5433.... Подскажите как это сделать. если просто меняю руками, то тест конненш не проходит
@shurik_codes4 ай бұрын
Порт сервера PostgreSQL меняется в настройках сервера PostgreSQL - свойство в postgresql.conf
@ИванГубарев-к4ь6 ай бұрын
Доброго времени суток. Может ли выскочить ошибка 403 из-за того что в папке config/keycloak/import не выгрузился realm?
@shurik_codes6 ай бұрын
Нет, если бы realm не выгрузился, то приложение не запустилось бы, т.к. параметры realm-а вычитываются при запуске приложения. При 403 ошибке обычно нужно копать в сторону CORS или CSRF
@svyatoiambrozii9 ай бұрын
При запуске команды выдает 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_codes9 ай бұрын
как выглядит выполняемая команда?
@svyatoiambrozii9 ай бұрын
@@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 а потом так же повторяю команду.
@svyatoiambrozii9 ай бұрын
@@shurik_codes я использовал из гит репозитория как разместили.
@denisitch8 ай бұрын
@@svyatoiambrozii указывай абсолютный путь к папке в проекте
@svyatoiambrozii8 ай бұрын
@@denisitch спасибо!)
@svyatoiambrozii9 ай бұрын
Дошел таки до запуска конфигурации и спринг выдает: 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_codes9 ай бұрын
Не сконфигурирован oauth2 клиент в файле свойств
@НатаСметанова9 ай бұрын
Добрый день! Вопрос по первой части видео - вроде делаю все так же, но при запросах к 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_codes9 ай бұрын
401 статус говорит о том, что пользователь не аутентифицирован, причин много может быть
@zackdd67519 ай бұрын
Товарищи, а лучше сам Александр)) помогите уде второй раз переписываю построчно блин. и как тоkько дохожу до oauth2, то всё время это(( Request processing failed: org.springframework.web.client.HttpClientErrorException$Unauthorized: 401 Unauthorized: [no body] Заранее Спасибо
@shurik_codes9 ай бұрын
Слишком мало информации. 401 возвращается, когда пользователь не может быть аутентифицирован, код к ролику: github.com/alex-kosarev/sc24/tree/SC24EP04-oauth
@zackdd67519 ай бұрын
@@shurik_codes Извиняюсь за панику) нужно ж было досмотреть до конца таки ролик. а там вы добавили SCOPE и всё теперь можно удалять и изменять...