Ссылка на телеграм-чат для обсуждения Spring + Java: t.me/+rFxdSCjJxdVjNWVi Ссылка на исходники: github.com/FlameXander/securi...
Жүктеу.....
Пікірлер: 116
@MrMadKlaus11 ай бұрын
Лучший. Грамотная речь, без слов паразитов, выверенный план лекции. И даже заминка помогает проследить, а как профи ищет ошибку. Спасибо!
@JanSobolewski19873 ай бұрын
@EnableGlobalMethodSecurity уже устарел, вместо него нужно воспользоваться аннотацией @EnableMethodSecurity, csrf тоже стал deprecated, поэтому заменим его лямбда выражение. Потом еще устарели методы authorizeRequests() и antMatchers() и and(). Итоговый код выглядит вот так : public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http .csrf(AbstractHttpConfigurer::disable) .cors(AbstractHttpConfigurer::disable) .authorizeHttpRequests(authz -> authz .requestMatchers("/secured").authenticated() .requestMatchers("/info").authenticated() .requestMatchers("/admin").hasRole("ADMIN") .anyRequest().permitAll()) .sessionManagement((sessionManagement) -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .exceptionHandling((exceptionHandling) -> exceptionHandling.authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))); //addFilterBefore() return http.build();
@timullka
3 ай бұрын
человек, ты лучший!
@Artem-zg9nc
Ай бұрын
очень сильно прарился но по итогу сделал сам и вроде как работает а потом увидел это сообщение и такой ндаааа
@KuziaribiiKit9 ай бұрын
Спасибо за видео!) Жду продолжения по спрингу😄
@staroyzakalki779910 ай бұрын
Спасибо большое вам за ваши лекции, все очень доходчиво и понятно. Узнал про вас в ГБ, жаль не удалось побывать у вас на онлайн занятиях.
@vorova10 ай бұрын
Спасибо Вам за видео с подробной информацией)
@user-jq1mt1oz1y9 ай бұрын
Благодарность 🙏 Лайк - подписка! Как я долго искал этот контент на доступном языке.
@artyomkogay7 ай бұрын
Циклическая зависимость возникает из-за того, что UserService зависит от PasswordEncoder, а SecurityConfig зависит от UserService. Проще всего делегировать создание Bean Definition на ioc контейнер и создать отдельную конфигурацию для PasswordEncoder, вынести PasswordEncoder-bean в отдельный класс PasswordEncoderConfiguration.
@user-nh3gd1mh7x
7 ай бұрын
Спасибо тебе мил человек за подсказку
@artyomkogay
5 ай бұрын
@@user-nh3gd1mh7x удачи вам!
@dmaberlin
3 ай бұрын
покажи пожалуйста эту реализацию на гитхабе =)
@user-sc6xq9up7i
14 күн бұрын
@@dmaberlin import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @Configuration public class PasswordEncoderConfiguration { @Bean public BCryptPasswordEncoder bCryptPasswordEncoder(){ return new BCryptPasswordEncoder(); } }
@user-pm9ip2tu9x2 ай бұрын
Грамотная речь и дикция, без лишних слов. Всё доходчиво! Очень уважаю Ваш труд. Хотелось бы по больше видео уроков от Вас.
@MrMaweer4 ай бұрын
Как же у вас речь поставлена - разбирался сам с JWT и голова болела, а тут такой подарок! Спасибо за лекцию!
@dmitrelkin925611 ай бұрын
Ура! Александр, спасибо! очень долгожданная тема ))
@drugsbunny_864110 ай бұрын
Огромное спасибо! Самый актуальный мануал по spring security + jwt)
@Devivl10 ай бұрын
Большое спасибо за видео. Приятно слушать.
@dimabzz11 ай бұрын
Очень доступно и все понятно 👌 Было бы здорово еще видео про микросервисы в сочетании spring security и spring gateway 😊
@elseff11 ай бұрын
Спасибо большое!!!! Очень ждал!! ❤
@kelevra_19853 ай бұрын
Благодарю , за видео. Ждем разбор по микросервисам.
@user-jz8xr5wf8z6 ай бұрын
спасибо большое! очень доступно для понимания !
@user-tc6hl9wc3d9 ай бұрын
Лучшее объяснение по теме на русском! Большое спасибо!
@alexxenon872110 ай бұрын
Спасибо за данный гайд, лучший просто!
@fleurdelicАй бұрын
вы лучший в аспекте объяснений, продолжайте, пожалуйста и спасибо огромное за ваш труд
@dmitrybaranov744711 ай бұрын
Спасибо! Сделал закладочку на будущее.Мне до этого далековато. Жду продолжения по основам.
@lifeisanadventure89514 ай бұрын
Спасибо огромное, четко и понятно! Таким людям памятники на вокзале ставить надо)))
@user-lx4dc1ls3e9 ай бұрын
Прекрасное объяснение для русской аудитории! Внятно и по делу! Спасибо автору за труд👍👍👍
@divergenny11 ай бұрын
Спасибо большое, вы лучший
@svrd-tech9 ай бұрын
Спасибо за урок! Было бы интересно рассмотреть случай с несколькими методами аутентификации, например - для пользователей через Google учетку, а для администраторов - по паролю. Ну и refreshToken для реализма)
@Makstrytolearn11 ай бұрын
Это лучший ментор! Гуру💪🏻🙏🏻
@blackobemamatters44189 ай бұрын
Спасибо автору за видео, очень информативно. Автор сделайте видос по микросервисах
@user-vi3bi4ev1r7 ай бұрын
Спасибо автору
@amaddiallo72788 ай бұрын
I do not understand the language well but the course is very well done thank you for sharing from french
@Kudasheev10 ай бұрын
Все супер! Можно еще улучшить, увеличив немного размер шрифта и всего остального.
@jersonmade804310 ай бұрын
Топ. Вот бы видос по микросервисам
@user-di3wg7yp4p11 ай бұрын
Спринг, ммм :) Спасибо!
@cwnik11 ай бұрын
Спасибо!🙂
@LordofTanksАй бұрын
Огромное спасибо)
@danilsadretdinov32475 ай бұрын
Спасибо вам
@aliksargsyan278210 ай бұрын
thank you for your provided content, it is very helpful and useful, but please change IDE theme to dark mode, I really struggle to understand what' going on there.
@_F_A_K_I_R_Ай бұрын
Хорош!👍
@user-yf2er5vr8q5 ай бұрын
super-puper ждем еще видосы
@funnychannel18885 ай бұрын
Большое спасибо конечно за твои 2 трансляции. Но представь, я просто угробил половину дня на поиск причины почему у меня выходила ошибка 403. В итоге оказалось, что я не прописывал префикс ROLE_ в бд и из-за этого аутентификация проходила, но с надписью ошибка 403. Я пролазил точкой остановы половину классов, которые добавил в конфиг. Вот такие моменты самые бесячие. Понял только когда в точке останова увидел строчку return hasAuthority(ROLE_PREFIX + role); А ну и естественно csrf().disabled().cors().disabled() обязательно ставить.
@user-hh8fk6kt2l11 ай бұрын
Спасибо за контент,правда мне до этого ещё далеко
@stepan-klyukin8 ай бұрын
супермегахарош
@desdichago9 ай бұрын
При авторизации дважды в базу лезем. AuthenticationManager под капотом сам бегает в UserService.
@timullka3 ай бұрын
Spring Security: Spring Security + REST + JWT 00:00 Введение • Видео объясняет, как использовать джи-ти-токины в спринг секьюрити для защиты приложений. • Рассматриваются примеры использования и настройки безопасности в рамках работы спринга. 01:52 Создание проекта • Создание проекта с использованием спринга, GPS, H2 базы данных, ломбака и флай эмиграйшн. • Настройка проекта и добавление зависимостей. 06:37 Настройка контроллеров и сущностей • Создание контроллеров и сущностей для работы с пользователями и ролями. • Настройка гет-мапингов и сущностей для доступа к данным. 14:29 Репозитории и интерфейсы • Создание репозиториев для работы с ролями и пользователями. • Создание интерфейсов для работы с ролями и пользователями. 15:29 Создание сущностей и репозиториев • Создание сущностей и репозиториев для работы с пользователями и ролями. • Использование аннотаций для создания сущностей и репозиториев. 19:29 Создание сервиса и методов • Создание юзер-сервиса для работы с пользователями и ролями. • Реализация методов для поиска пользователей, создания новых пользователей и преобразования пользователей к виду, понимаемому Spring Security. 26:25 Конфигурация безопасности • Создание пакета конфиг-конфигурации и настройка конфигурации безопасности. • Использование аннотаций и бинов для настройки правил безопасности, хранения паролей и использования юзер-сервиса. • Создание бина для настройки анти-кейшн провайдера и юзер-сервиса. 31:21 Безопасность в REST • В REST нет сессий, поэтому безопасность основана на токенах. • Токен содержит информацию о пользователе, его роли и подписывается секретным ключом. • Токен подшивается к каждому запросу и проверяется на бэкенде. 42:13 Токен и его структура • Токен состоит из заголовка, полезной нагрузки и подписи. • Заголовок кодируется с помощью алгоритма, полезная нагрузка кодируется с помощью другого алгоритма, а подпись формируется с использованием секретного ключа. • Токен может быть расшифрован, но не подменен. 46:13 Создание утилиты для работы с токенами • Создание класса, который будет отвечать за работу с токенами, и инжектирование значений в его поля. • Создание методов для формирования токена из пользователя, получения списка ролей из токена и проверки его на корректность. 58:05 Аутентификация пользователя и выдача токена • Создание контроллера для аутентификации и регистрации пользователей, инжектирование юзер-сервиса и других необходимых компонентов. • Создание дтошек для передачи данных о пользователе и получения токена. • Использование аутенти-менеджера для проверки логина и пароля и возврата успешного результата или ошибки аутентификации. • Создание дтошки для обработки ошибок аутентификации. 01:03:01 Получение токена • Создание конструктора для получения токена с указанием статуса, сообщения и текущего времени. • Использование конструктора для формирования токена и его возврата в качестве ответа. 01:09:42 Проверка токена • Защита токена с помощью подписи, которая не может быть изменена без знания секрета. • Если подпись изменена, то бэк получает ошибку о том, что токен недействителен. 01:12:27 Создание фильтра безопасности • Создание фильтра безопасности, который проверяет наличие токена и его корректность. • Использование утилиты для получения токена из заголовка авторизации. • Проверка корректности заголовка авторизации и получение имени пользователя из токена. 01:18:23 Работа с токенами и контекстом • В видео рассказывается о том, как с помощью утилит можно сделать гет-юзернейм и проверить пользователя. • Если время жизни токена истекло, то в контексте пользователя не будет. • Если имя пользователя найдено, то проверяется, что в контексте нет других пользователей. • Если все хорошо, то имя пользователя и список ролей из токена добавляются в контекст. 01:29:15 Регистрация и фильтрация • В видео демонстрируется регистрация пользователя и фильтрация данных в токене. • Если пароли не совпадают, то возвращается ошибка. • Если пользователь уже существует, то запрос отклоняется. • В общем, автор рекомендует спрятать обработку исключений в аутсервис и использовать глобальный перехват исключений для обработки ошибок. 01:34:15 Создание и использование токена • Обсуждение использования инкодера для шифрования пароля и его хранения в базе данных. • Создание и использование токена для аутентификации пользователя. 01:46:22 Регистрация пользователя и использование токена • Регистрация пользователя с использованием пароля и инкодера. • Создание токена для пользователя и его использование для аутентификации. 01:50:22 Итоги и обсуждение • Обсуждение принципов работы с токенами и их использования в проектах на Spring. • Ответы на вопросы зрителей и приглашение к обсуждению в комментариях.
@user-if3cd8em4q
2 ай бұрын
Нейросети имба
@lusterluster6403
2 ай бұрын
что за нейросеть?
@user-if3cd8em4q
2 ай бұрын
от яндекса, которая пересказывает видео@@lusterluster6403
@timullka
2 ай бұрын
Встроенная в браузер Яндекс
@swampfolkband6 ай бұрын
А можно ещё видео как разлогиниться) а то как-то не полно вышло!)
@bones_wp_2 ай бұрын
Почему нельзя было снять сразу с Spring Boot 3? Объяснение логики это хорошо конечно, но практическое применение только на устаревших проектах, т.к. с 6 версии Security подход изменился
@FlameXander11 ай бұрын
Исходники чуть попозже залью на GitHub
@FlameXander
10 ай бұрын
@@anyone7783 прикрепил ссылку в описании и в комментариях
@matriks20075 ай бұрын
Подскажите, можно ли записаться на ваши курсы? Если можно то где?
@user-yf2er5vr8q5 ай бұрын
не хотите снять видео какой-то проект типа магазина
@user-qi8sl7by3r9 ай бұрын
То есть контроллер authitization заменяет контроллер login?
@vitya46465 ай бұрын
А что делать если мы пользователю поменяли право или например удалили его? Получается что другой сервис, пока lifetime не истек, все равно прочитает токен и посчитает его корректным? Какое решение тут выбрать? Или JWT не про это и лучше тогда использовать сессии?
@oopsoops904010 ай бұрын
Я просто смотрю и в шоке сколько я не знаю и как это вообще уложить в своей бошке😢 Я пытаюсь устроиться хотя бы на трейни или джуна. Но спринг со всеми своими библиотеками вообще тяжело идёт. Все эти аннотации и под классы 🥴
@hypnoZzzable2 ай бұрын
Здравствуйте. 2 день не пойму как сделать токен просроченным, чтобы он не работал для скажем заблокированного юзера. Можно ли как то подменить в существующем токене дату истечения срока жизни?
@kolyanlock10 ай бұрын
Когда я делал авторизацию и аутентификацию на Python DRF удалось довольно быстро всё настроить и ещё logout сделать, но там токены были обычные не JWT и хранились в БД привязанные к пользователю и из можно было посмотреть и удалить или изменить через админку (которая кстати из коробки в Django, только настроить надо было что там будет). Я так понимаю JWT токены не обязательно сохранять в БД, т.к. в них закодированы username, roles и lifetime. Но как тогда сделать logout? Хранить список недействительных токенов или просто сохранять токены в бд? Какой подход надо лучше использовать?
@egribanov
10 ай бұрын
Технически токен хранит приложение или браузер, если его удалить оттуда, то оно не сможет отправить запрос, потребуется авторизация, а на стороне бека просто время жизни токена истечет
@AB-ku1su6 ай бұрын
я не пойму тут старый спринг секьюрити? сейчас он так фильтрчейн не конфигурируется
@jeakkey10 ай бұрын
Всё круто, спасибо, очень классное объяснение. Но JwtRequestFilter срабатывает на каждый запрос и из-за этого возвращается пустой 200 стоатус по всем запросам. Тут что-то надо поменять в конфигах или логику добавить в JwtRequestFilter
@RealMrPitsa
7 ай бұрын
А в конце вызывается filterChain.doFilter(request, response)?
@user-bn9wc8db6sАй бұрын
185 раз смотрю, так и не могу разобраться, что к чему в этом security)))
@ukratitelkisok9726
18 күн бұрын
да все объясняют через жопу, данный автор один из немногих у кого получилось сделать по другому(хорошо). Но я бы рекомендовал начать с этого видео и подобных kzread.info/dash/bejne/omqBusRpd9e-p8o.html
@eugenesmith99407 ай бұрын
А в чем суть наличия и работы через Principle или UserDetails интерфейсы, если у нас есть свой класс (условный User тот же или Customer, Employee и т.д), у которого мы можем получать все необходимое для авторизации и аутентификации? PS. это вопрос из разряда "хочу понять Principle и UserDetails(Service)".
@mishaprokopovich5253
6 ай бұрын
Интерфейс Principal представляет аутентифицированного пользователя. У него есть только метод getName().Principal не дает подробной информации о пользователях, таких как пароль, роли или разрешения. Интерфейс UserDetails представляет полные детали пользователя, необходимые для аутентификации и авторизации. У него есть разные методы по получению информации о пользователе ( getUsername(), getAuthorities(), getPassword() и т.п.)
@AB-ku1su6 ай бұрын
секрет любой или какой то особенный нужен?
@RustamPlayer5 ай бұрын
Есть ли какая то конкретная причина использования Date для времени, или можно спокойно использовать Local[Date/Time/DateTime]?
@FlameXander
5 ай бұрын
Можно спокойно использовать LocalDateTime
@user-gv3zn1us6s4 ай бұрын
Под конец немного путанная подача, но тема сложная и даже автор немного подвисал или слабовато подготовился. Очень не хватает: 1. тайм-лайна 2. Ссылок после видео
@nursalga2 ай бұрын
Объяснение хорошее. Но реализация хромает. Не показано как настраивать h2, flyway. Без которых проект не запускается или не работает как показано на видео
@user-jk4gc6nv7l9 ай бұрын
Jwt использует javax.xml.bind.DatatypeConverter но в новых версиях java оно не используется и выдает ошибку
@user-jk4gc6nv7l
9 ай бұрын
Может уже есть новая версия где не используется avax.xml.bind.DatatypeConverter?
@nataliasidorova8878
6 ай бұрын
Нужна зависимость javax.xml.bind:jaxb-api
@den926111 ай бұрын
в нормальном качестве будет позже , я так понимаю ? тема очень нужная и интересная
@user-yc1gx2ug1v
11 ай бұрын
+ тоже жду лучше кач-во
@FlameXander
11 ай бұрын
KZread еще несколько часов видео будет обрабатывать и потом да, будет нормальное качество
@egribanov
11 ай бұрын
@@FlameXander а можно ожидать что появится видео про юнит тесты? Особенно авторизация прям требует чтобы была покрыта юнит тестами
У кого-то возникала ошибка, что бин AuthenticationManager не регистрируется?
@jersonmade8043
4 ай бұрын
Решил проблему, если будете пробовать реализовывать, то класс SecurityConfig помечайте аннотацией @Configuration
@amir18n
4 ай бұрын
@@jersonmade8043 спасибо большое! долго возился не понимал почему на все запросы 401 ловил. после добавления @Configuration все заработало
@timullka
3 ай бұрын
лучший ты мне помог!!!!!!!! @@jersonmade8043
@FlameXander10 ай бұрын
Ссылка на исходники: github.com/FlameXander/security-jwt
@mishaprokopovich52536 ай бұрын
У меня user может заходить куда угодно и получать корректные ответы, а вот admin нет, в /secured возвращается пустой текст, хотя user-у отдавалась строка secured-data, была у кого-нибудь схожая ситуация?
@kai_9482
4 ай бұрын
может в конфиге что-то? Вот пример моего конфига: ``` @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http .csrf(csrf -> csrf.disable()) .cors(cors -> cors.configurationSource(request -> { var corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowedOriginPatterns(List.of("*")); corsConfiguration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS")); corsConfiguration.setAllowedHeaders(List.of("*")); corsConfiguration.setAllowCredentials(true); return corsConfiguration; })) .authorizeHttpRequests((requests) -> requests .requestMatchers("/user/log").permitAll() .requestMatchers("/user/logpost").permitAll() .requestMatchers("/user/reg").permitAll() .requestMatchers("/").hasAnyRole("ADMIN","USER") .requestMatchers("/user").permitAll() .requestMatchers("/admin").hasRole("ADMIN") .anyRequest().authenticated()) .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .exceptionHandling(exceptions -> exceptions .authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED)) ) .httpBasic(Customizer.withDefaults()) .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } ```
@user-qi8sl7by3r9 ай бұрын
И помогите пожалуйста прописать контроллер logout
@kai_94824 ай бұрын
Хотелось бы теперь узнать, как сдлеать вход без postman так, чтобы токен встравивался в сылку 🤔🤔
@FlameXander
4 ай бұрын
Это достаточно просто делается на фронтенде
@kai_9482
4 ай бұрын
@@FlameXander я в фронтенде не шарю, не могли бы вы скинуть статью? Если не затруднит.
@user-zm1jr6xs5r
2 ай бұрын
@@FlameXander я пытаюсь запустить через постман registration, но не могу понять каким должен быть путь
@EndofLine3357 ай бұрын
Слушайте, вопрос такой. С какой-то версии спринга поменяли принцип описания SecurityFilterChain. Теперь тот метод через .cors().disable() и .csrf().disable() не совсем валиден. Подскажите, как выкрутиться?
@ArtFanRamm
6 ай бұрын
http.cors(cors -> cors.disable()).csrf(csrf -> csrf.disable()) и т.д.
У меня скоро крыша полетит, до сих пор не нашёл нужного гайда как встроить токен в сылку
@kolyanlock10 ай бұрын
Почему когда я кладу в claims List, потом достаю его, idea не может успокоиться и пишет что метод должен возвращать не List, а прост List, если я так сделаю это начнутся другие предупреждения, к решению я так и не пришёл, кроме как игнорировать, но почему же у меня так происходит, у вас такого не было когда вы писали код?
@egribanov
10 ай бұрын
так же светилось желтым предупреждение. как вариант можно сделать так: public List getRoles(String token) { List roles = getAllClaimsFromToken(token).get("roles", List.class); return roles.stream().map(Object::toString).toList(); } или просто повесить аннотацию @SuppressWarnings("unchecked")
@jurii45554 ай бұрын
хтось може надіслати посилання на телеграм канал а то ця не дійсна
@TEOOOOOOOOOOOO2 ай бұрын
почему выходит циклическая зависимость, потому что в SecurityConfig мы инжектим UserService userService;
@TEOOOOOOOOOOOO
2 ай бұрын
@Bean public DaoAuthenticationProvider daoAuthenticationProvider() { DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider(); daoAuthenticationProvider.setPasswordEncoder(passwordEncoder()); daoAuthenticationProvider.setUserDetailsService(userService); return daoAuthenticationProvider; } Создание этого бина лишнее
@denystry
28 күн бұрын
@@TEOOOOOOOOOOOO спасибо
@den926111 ай бұрын
Туман в мозгу по поводу jwt начинает рассеиваться )
@hookeym71516 ай бұрын
много что не объясняешь
@svyatoiambrozii10 ай бұрын
Отличнное обьяснение работы!😊 а можно ли из principal.getname() его имя таким образом сохранять например как автора сообщения что он создает например. Если Principal будет в аигументе метода. Или лучше для таких случаев использовать @AutentificationPrincipal User user и из него получать детали?
@trz1816 күн бұрын
метод контролера auth не авторизует пользователя и выдает сообщение o.s.s.c.bcrypt.BCryptPasswordEncoder : Encoded password does not look like BCrypt
@RealMrPitsa7 ай бұрын
Для разрешения циклической зависимости можно либо создать конструктор явно и указать в нём @Lazy, либо добавить после @RequiredArgsConstructor (onConstructor_={@Lazy})
Пікірлер: 116
Лучший. Грамотная речь, без слов паразитов, выверенный план лекции. И даже заминка помогает проследить, а как профи ищет ошибку. Спасибо!
@EnableGlobalMethodSecurity уже устарел, вместо него нужно воспользоваться аннотацией @EnableMethodSecurity, csrf тоже стал deprecated, поэтому заменим его лямбда выражение. Потом еще устарели методы authorizeRequests() и antMatchers() и and(). Итоговый код выглядит вот так : public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http .csrf(AbstractHttpConfigurer::disable) .cors(AbstractHttpConfigurer::disable) .authorizeHttpRequests(authz -> authz .requestMatchers("/secured").authenticated() .requestMatchers("/info").authenticated() .requestMatchers("/admin").hasRole("ADMIN") .anyRequest().permitAll()) .sessionManagement((sessionManagement) -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .exceptionHandling((exceptionHandling) -> exceptionHandling.authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))); //addFilterBefore() return http.build();
@timullka
3 ай бұрын
человек, ты лучший!
@Artem-zg9nc
Ай бұрын
очень сильно прарился но по итогу сделал сам и вроде как работает а потом увидел это сообщение и такой ндаааа
Спасибо за видео!) Жду продолжения по спрингу😄
Спасибо большое вам за ваши лекции, все очень доходчиво и понятно. Узнал про вас в ГБ, жаль не удалось побывать у вас на онлайн занятиях.
Спасибо Вам за видео с подробной информацией)
Благодарность 🙏 Лайк - подписка! Как я долго искал этот контент на доступном языке.
Циклическая зависимость возникает из-за того, что UserService зависит от PasswordEncoder, а SecurityConfig зависит от UserService. Проще всего делегировать создание Bean Definition на ioc контейнер и создать отдельную конфигурацию для PasswordEncoder, вынести PasswordEncoder-bean в отдельный класс PasswordEncoderConfiguration.
@user-nh3gd1mh7x
7 ай бұрын
Спасибо тебе мил человек за подсказку
@artyomkogay
5 ай бұрын
@@user-nh3gd1mh7x удачи вам!
@dmaberlin
3 ай бұрын
покажи пожалуйста эту реализацию на гитхабе =)
@user-sc6xq9up7i
14 күн бұрын
@@dmaberlin import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @Configuration public class PasswordEncoderConfiguration { @Bean public BCryptPasswordEncoder bCryptPasswordEncoder(){ return new BCryptPasswordEncoder(); } }
Грамотная речь и дикция, без лишних слов. Всё доходчиво! Очень уважаю Ваш труд. Хотелось бы по больше видео уроков от Вас.
Как же у вас речь поставлена - разбирался сам с JWT и голова болела, а тут такой подарок! Спасибо за лекцию!
Ура! Александр, спасибо! очень долгожданная тема ))
Огромное спасибо! Самый актуальный мануал по spring security + jwt)
Большое спасибо за видео. Приятно слушать.
Очень доступно и все понятно 👌 Было бы здорово еще видео про микросервисы в сочетании spring security и spring gateway 😊
Спасибо большое!!!! Очень ждал!! ❤
Благодарю , за видео. Ждем разбор по микросервисам.
спасибо большое! очень доступно для понимания !
Лучшее объяснение по теме на русском! Большое спасибо!
Спасибо за данный гайд, лучший просто!
вы лучший в аспекте объяснений, продолжайте, пожалуйста и спасибо огромное за ваш труд
Спасибо! Сделал закладочку на будущее.Мне до этого далековато. Жду продолжения по основам.
Спасибо огромное, четко и понятно! Таким людям памятники на вокзале ставить надо)))
Прекрасное объяснение для русской аудитории! Внятно и по делу! Спасибо автору за труд👍👍👍
Спасибо большое, вы лучший
Спасибо за урок! Было бы интересно рассмотреть случай с несколькими методами аутентификации, например - для пользователей через Google учетку, а для администраторов - по паролю. Ну и refreshToken для реализма)
Это лучший ментор! Гуру💪🏻🙏🏻
Спасибо автору за видео, очень информативно. Автор сделайте видос по микросервисах
Спасибо автору
I do not understand the language well but the course is very well done thank you for sharing from french
Все супер! Можно еще улучшить, увеличив немного размер шрифта и всего остального.
Топ. Вот бы видос по микросервисам
Спринг, ммм :) Спасибо!
Спасибо!🙂
Огромное спасибо)
Спасибо вам
thank you for your provided content, it is very helpful and useful, but please change IDE theme to dark mode, I really struggle to understand what' going on there.
Хорош!👍
super-puper ждем еще видосы
Большое спасибо конечно за твои 2 трансляции. Но представь, я просто угробил половину дня на поиск причины почему у меня выходила ошибка 403. В итоге оказалось, что я не прописывал префикс ROLE_ в бд и из-за этого аутентификация проходила, но с надписью ошибка 403. Я пролазил точкой остановы половину классов, которые добавил в конфиг. Вот такие моменты самые бесячие. Понял только когда в точке останова увидел строчку return hasAuthority(ROLE_PREFIX + role); А ну и естественно csrf().disabled().cors().disabled() обязательно ставить.
Спасибо за контент,правда мне до этого ещё далеко
супермегахарош
При авторизации дважды в базу лезем. AuthenticationManager под капотом сам бегает в UserService.
Spring Security: Spring Security + REST + JWT 00:00 Введение • Видео объясняет, как использовать джи-ти-токины в спринг секьюрити для защиты приложений. • Рассматриваются примеры использования и настройки безопасности в рамках работы спринга. 01:52 Создание проекта • Создание проекта с использованием спринга, GPS, H2 базы данных, ломбака и флай эмиграйшн. • Настройка проекта и добавление зависимостей. 06:37 Настройка контроллеров и сущностей • Создание контроллеров и сущностей для работы с пользователями и ролями. • Настройка гет-мапингов и сущностей для доступа к данным. 14:29 Репозитории и интерфейсы • Создание репозиториев для работы с ролями и пользователями. • Создание интерфейсов для работы с ролями и пользователями. 15:29 Создание сущностей и репозиториев • Создание сущностей и репозиториев для работы с пользователями и ролями. • Использование аннотаций для создания сущностей и репозиториев. 19:29 Создание сервиса и методов • Создание юзер-сервиса для работы с пользователями и ролями. • Реализация методов для поиска пользователей, создания новых пользователей и преобразования пользователей к виду, понимаемому Spring Security. 26:25 Конфигурация безопасности • Создание пакета конфиг-конфигурации и настройка конфигурации безопасности. • Использование аннотаций и бинов для настройки правил безопасности, хранения паролей и использования юзер-сервиса. • Создание бина для настройки анти-кейшн провайдера и юзер-сервиса. 31:21 Безопасность в REST • В REST нет сессий, поэтому безопасность основана на токенах. • Токен содержит информацию о пользователе, его роли и подписывается секретным ключом. • Токен подшивается к каждому запросу и проверяется на бэкенде. 42:13 Токен и его структура • Токен состоит из заголовка, полезной нагрузки и подписи. • Заголовок кодируется с помощью алгоритма, полезная нагрузка кодируется с помощью другого алгоритма, а подпись формируется с использованием секретного ключа. • Токен может быть расшифрован, но не подменен. 46:13 Создание утилиты для работы с токенами • Создание класса, который будет отвечать за работу с токенами, и инжектирование значений в его поля. • Создание методов для формирования токена из пользователя, получения списка ролей из токена и проверки его на корректность. 58:05 Аутентификация пользователя и выдача токена • Создание контроллера для аутентификации и регистрации пользователей, инжектирование юзер-сервиса и других необходимых компонентов. • Создание дтошек для передачи данных о пользователе и получения токена. • Использование аутенти-менеджера для проверки логина и пароля и возврата успешного результата или ошибки аутентификации. • Создание дтошки для обработки ошибок аутентификации. 01:03:01 Получение токена • Создание конструктора для получения токена с указанием статуса, сообщения и текущего времени. • Использование конструктора для формирования токена и его возврата в качестве ответа. 01:09:42 Проверка токена • Защита токена с помощью подписи, которая не может быть изменена без знания секрета. • Если подпись изменена, то бэк получает ошибку о том, что токен недействителен. 01:12:27 Создание фильтра безопасности • Создание фильтра безопасности, который проверяет наличие токена и его корректность. • Использование утилиты для получения токена из заголовка авторизации. • Проверка корректности заголовка авторизации и получение имени пользователя из токена. 01:18:23 Работа с токенами и контекстом • В видео рассказывается о том, как с помощью утилит можно сделать гет-юзернейм и проверить пользователя. • Если время жизни токена истекло, то в контексте пользователя не будет. • Если имя пользователя найдено, то проверяется, что в контексте нет других пользователей. • Если все хорошо, то имя пользователя и список ролей из токена добавляются в контекст. 01:29:15 Регистрация и фильтрация • В видео демонстрируется регистрация пользователя и фильтрация данных в токене. • Если пароли не совпадают, то возвращается ошибка. • Если пользователь уже существует, то запрос отклоняется. • В общем, автор рекомендует спрятать обработку исключений в аутсервис и использовать глобальный перехват исключений для обработки ошибок. 01:34:15 Создание и использование токена • Обсуждение использования инкодера для шифрования пароля и его хранения в базе данных. • Создание и использование токена для аутентификации пользователя. 01:46:22 Регистрация пользователя и использование токена • Регистрация пользователя с использованием пароля и инкодера. • Создание токена для пользователя и его использование для аутентификации. 01:50:22 Итоги и обсуждение • Обсуждение принципов работы с токенами и их использования в проектах на Spring. • Ответы на вопросы зрителей и приглашение к обсуждению в комментариях.
@user-if3cd8em4q
2 ай бұрын
Нейросети имба
@lusterluster6403
2 ай бұрын
что за нейросеть?
@user-if3cd8em4q
2 ай бұрын
от яндекса, которая пересказывает видео@@lusterluster6403
@timullka
2 ай бұрын
Встроенная в браузер Яндекс
А можно ещё видео как разлогиниться) а то как-то не полно вышло!)
Почему нельзя было снять сразу с Spring Boot 3? Объяснение логики это хорошо конечно, но практическое применение только на устаревших проектах, т.к. с 6 версии Security подход изменился
Исходники чуть попозже залью на GitHub
@FlameXander
10 ай бұрын
@@anyone7783 прикрепил ссылку в описании и в комментариях
Подскажите, можно ли записаться на ваши курсы? Если можно то где?
не хотите снять видео какой-то проект типа магазина
То есть контроллер authitization заменяет контроллер login?
А что делать если мы пользователю поменяли право или например удалили его? Получается что другой сервис, пока lifetime не истек, все равно прочитает токен и посчитает его корректным? Какое решение тут выбрать? Или JWT не про это и лучше тогда использовать сессии?
Я просто смотрю и в шоке сколько я не знаю и как это вообще уложить в своей бошке😢 Я пытаюсь устроиться хотя бы на трейни или джуна. Но спринг со всеми своими библиотеками вообще тяжело идёт. Все эти аннотации и под классы 🥴
Здравствуйте. 2 день не пойму как сделать токен просроченным, чтобы он не работал для скажем заблокированного юзера. Можно ли как то подменить в существующем токене дату истечения срока жизни?
Когда я делал авторизацию и аутентификацию на Python DRF удалось довольно быстро всё настроить и ещё logout сделать, но там токены были обычные не JWT и хранились в БД привязанные к пользователю и из можно было посмотреть и удалить или изменить через админку (которая кстати из коробки в Django, только настроить надо было что там будет). Я так понимаю JWT токены не обязательно сохранять в БД, т.к. в них закодированы username, roles и lifetime. Но как тогда сделать logout? Хранить список недействительных токенов или просто сохранять токены в бд? Какой подход надо лучше использовать?
@egribanov
10 ай бұрын
Технически токен хранит приложение или браузер, если его удалить оттуда, то оно не сможет отправить запрос, потребуется авторизация, а на стороне бека просто время жизни токена истечет
я не пойму тут старый спринг секьюрити? сейчас он так фильтрчейн не конфигурируется
Всё круто, спасибо, очень классное объяснение. Но JwtRequestFilter срабатывает на каждый запрос и из-за этого возвращается пустой 200 стоатус по всем запросам. Тут что-то надо поменять в конфигах или логику добавить в JwtRequestFilter
@RealMrPitsa
7 ай бұрын
А в конце вызывается filterChain.doFilter(request, response)?
185 раз смотрю, так и не могу разобраться, что к чему в этом security)))
@ukratitelkisok9726
18 күн бұрын
да все объясняют через жопу, данный автор один из немногих у кого получилось сделать по другому(хорошо). Но я бы рекомендовал начать с этого видео и подобных kzread.info/dash/bejne/omqBusRpd9e-p8o.html
А в чем суть наличия и работы через Principle или UserDetails интерфейсы, если у нас есть свой класс (условный User тот же или Customer, Employee и т.д), у которого мы можем получать все необходимое для авторизации и аутентификации? PS. это вопрос из разряда "хочу понять Principle и UserDetails(Service)".
@mishaprokopovich5253
6 ай бұрын
Интерфейс Principal представляет аутентифицированного пользователя. У него есть только метод getName().Principal не дает подробной информации о пользователях, таких как пароль, роли или разрешения. Интерфейс UserDetails представляет полные детали пользователя, необходимые для аутентификации и авторизации. У него есть разные методы по получению информации о пользователе ( getUsername(), getAuthorities(), getPassword() и т.п.)
секрет любой или какой то особенный нужен?
Есть ли какая то конкретная причина использования Date для времени, или можно спокойно использовать Local[Date/Time/DateTime]?
@FlameXander
5 ай бұрын
Можно спокойно использовать LocalDateTime
Под конец немного путанная подача, но тема сложная и даже автор немного подвисал или слабовато подготовился. Очень не хватает: 1. тайм-лайна 2. Ссылок после видео
Объяснение хорошее. Но реализация хромает. Не показано как настраивать h2, flyway. Без которых проект не запускается или не работает как показано на видео
Jwt использует javax.xml.bind.DatatypeConverter но в новых версиях java оно не используется и выдает ошибку
@user-jk4gc6nv7l
9 ай бұрын
Может уже есть новая версия где не используется avax.xml.bind.DatatypeConverter?
@nataliasidorova8878
6 ай бұрын
Нужна зависимость javax.xml.bind:jaxb-api
в нормальном качестве будет позже , я так понимаю ? тема очень нужная и интересная
@user-yc1gx2ug1v
11 ай бұрын
+ тоже жду лучше кач-во
@FlameXander
11 ай бұрын
KZread еще несколько часов видео будет обрабатывать и потом да, будет нормальное качество
@egribanov
11 ай бұрын
@@FlameXander а можно ожидать что появится видео про юнит тесты? Особенно авторизация прям требует чтобы была покрыта юнит тестами
jwt: secret:111ddd lifetime:30m 'Cannot resolve configuration property 'jwt'
У кого-то возникала ошибка, что бин AuthenticationManager не регистрируется?
@jersonmade8043
4 ай бұрын
Решил проблему, если будете пробовать реализовывать, то класс SecurityConfig помечайте аннотацией @Configuration
@amir18n
4 ай бұрын
@@jersonmade8043 спасибо большое! долго возился не понимал почему на все запросы 401 ловил. после добавления @Configuration все заработало
@timullka
3 ай бұрын
лучший ты мне помог!!!!!!!! @@jersonmade8043
Ссылка на исходники: github.com/FlameXander/security-jwt
У меня user может заходить куда угодно и получать корректные ответы, а вот admin нет, в /secured возвращается пустой текст, хотя user-у отдавалась строка secured-data, была у кого-нибудь схожая ситуация?
@kai_9482
4 ай бұрын
может в конфиге что-то? Вот пример моего конфига: ``` @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http .csrf(csrf -> csrf.disable()) .cors(cors -> cors.configurationSource(request -> { var corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowedOriginPatterns(List.of("*")); corsConfiguration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS")); corsConfiguration.setAllowedHeaders(List.of("*")); corsConfiguration.setAllowCredentials(true); return corsConfiguration; })) .authorizeHttpRequests((requests) -> requests .requestMatchers("/user/log").permitAll() .requestMatchers("/user/logpost").permitAll() .requestMatchers("/user/reg").permitAll() .requestMatchers("/").hasAnyRole("ADMIN","USER") .requestMatchers("/user").permitAll() .requestMatchers("/admin").hasRole("ADMIN") .anyRequest().authenticated()) .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .exceptionHandling(exceptions -> exceptions .authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED)) ) .httpBasic(Customizer.withDefaults()) .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } ```
И помогите пожалуйста прописать контроллер logout
Хотелось бы теперь узнать, как сдлеать вход без postman так, чтобы токен встравивался в сылку 🤔🤔
@FlameXander
4 ай бұрын
Это достаточно просто делается на фронтенде
@kai_9482
4 ай бұрын
@@FlameXander я в фронтенде не шарю, не могли бы вы скинуть статью? Если не затруднит.
@user-zm1jr6xs5r
2 ай бұрын
@@FlameXander я пытаюсь запустить через постман registration, но не могу понять каким должен быть путь
Слушайте, вопрос такой. С какой-то версии спринга поменяли принцип описания SecurityFilterChain. Теперь тот метод через .cors().disable() и .csrf().disable() не совсем валиден. Подскажите, как выкрутиться?
@ArtFanRamm
6 ай бұрын
http.cors(cors -> cors.disable()).csrf(csrf -> csrf.disable()) и т.д.
@kai_9482
4 ай бұрын
@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http .csrf(csrf -> csrf.disable()) .cors(cors -> cors.configurationSource(request -> { var corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowedOriginPatterns(List.of("*")); corsConfiguration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS")); corsConfiguration.setAllowedHeaders(List.of("*")); corsConfiguration.setAllowCredentials(true); return corsConfiguration; })) .authorizeHttpRequests((requests) -> requests .requestMatchers("/user/log").permitAll() .requestMatchers("/user/logpost").permitAll() .requestMatchers("/user/reg").permitAll() .requestMatchers("/").hasAnyRole("ADMIN","USER") .requestMatchers("/user").permitAll() .requestMatchers("/admin").hasRole("ADMIN") .anyRequest().authenticated()) .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .exceptionHandling(exceptions -> exceptions .authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED)) ) .httpBasic(Customizer.withDefaults()) .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); }
@locbkm1269
2 ай бұрын
@@kai_9482 Спасибо большое
У меня скоро крыша полетит, до сих пор не нашёл нужного гайда как встроить токен в сылку
Почему когда я кладу в claims List, потом достаю его, idea не может успокоиться и пишет что метод должен возвращать не List, а прост List, если я так сделаю это начнутся другие предупреждения, к решению я так и не пришёл, кроме как игнорировать, но почему же у меня так происходит, у вас такого не было когда вы писали код?
@egribanov
10 ай бұрын
так же светилось желтым предупреждение. как вариант можно сделать так: public List getRoles(String token) { List roles = getAllClaimsFromToken(token).get("roles", List.class); return roles.stream().map(Object::toString).toList(); } или просто повесить аннотацию @SuppressWarnings("unchecked")
хтось може надіслати посилання на телеграм канал а то ця не дійсна
почему выходит циклическая зависимость, потому что в SecurityConfig мы инжектим UserService userService;
@TEOOOOOOOOOOOO
2 ай бұрын
@Bean public DaoAuthenticationProvider daoAuthenticationProvider() { DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider(); daoAuthenticationProvider.setPasswordEncoder(passwordEncoder()); daoAuthenticationProvider.setUserDetailsService(userService); return daoAuthenticationProvider; } Создание этого бина лишнее
@denystry
28 күн бұрын
@@TEOOOOOOOOOOOO спасибо
Туман в мозгу по поводу jwt начинает рассеиваться )
много что не объясняешь
Отличнное обьяснение работы!😊 а можно ли из principal.getname() его имя таким образом сохранять например как автора сообщения что он создает например. Если Principal будет в аигументе метода. Или лучше для таких случаев использовать @AutentificationPrincipal User user и из него получать детали?
метод контролера auth не авторизует пользователя и выдает сообщение o.s.s.c.bcrypt.BCryptPasswordEncoder : Encoded password does not look like BCrypt
Для разрешения циклической зависимости можно либо создать конструктор явно и указать в нём @Lazy, либо добавить после @RequiredArgsConstructor (onConstructor_={@Lazy})