Создание Spring Security REST API с использованием JWT токена

  Рет қаралды 119,153

Eugene Suleimanov

Eugene Suleimanov

Күн бұрын

Ссылка на репозиторий с исходным кодом проекта:
github.com/pro...
Ссылка на документацию Spring Security:
docs.spring.io...
CSRF:
ru.wikipedia.o...
habr.com/ru/po...
В данном видео создано REST API с использованием Spring Security. Аутентификация и авторизация реализованы с использованием JWT токена.
Технологии:
Java, Spring (IoC, Web, Data, Security), MySQL, Lombok, JsonWebToken, Liquibase, Git.

Пікірлер: 415
@AndriiHabchak-l2u
@AndriiHabchak-l2u 4 жыл бұрын
Прелесть данного туториала в том, что он не слишком сложный и не слишком простой. То есть, это не банальный 'hello world', который не понятно как применять в реальном проекте. Также это не перегруженный проект в котором сложно разобраться. Золотая середина! Очень классно рассказал о Spring Security. Какие компоненты за что отвечают. Наконец-то стало ясно как оно работает и как настраивать. П.с. Надеюсь ты уже улучшил свои скилы работы с Optional.
@egorvakulenko6198
@egorvakulenko6198 4 жыл бұрын
Очень полезное видео! Спасибо! Еще и тему DTO зацепил - вообще Красавчик!
@EugeneSuleimanov
@EugeneSuleimanov 3 жыл бұрын
Спасибо за отзыв!
@VladimirDubenco
@VladimirDubenco 3 жыл бұрын
А еще и показал как правильно аннотировать BaseEntity !
@АлександрБугримов-о1е
@АлександрБугримов-о1е 5 жыл бұрын
Спасибо за видео. Не пропадайте, очень интересно!
@EugeneSuleimanov
@EugeneSuleimanov 5 жыл бұрын
Спасибо за отзыв, Александр. Постараюсь )
@k0jihero
@k0jihero 3 жыл бұрын
@@EugeneSuleimanov Евгений, снимите туториал по микросервисам)
@ВладимирЛавров-у6т
@ВладимирЛавров-у6т 4 жыл бұрын
Очень крутое видео! Спасибо. Единственное полное видео по этой теме, которое смог найти.
@arturbarkou6347
@arturbarkou6347 4 жыл бұрын
Все работает, спасибо больше за видео. Было бы круто добавить походу больше пояснений про внутреннее устройство spring security и почему сделано так а не иначе вместо надиктовывания строчек кода.
@EugeneSuleimanov
@EugeneSuleimanov 3 жыл бұрын
Спасибо за отзыв! По поводу более глубокого объяснения - здесь мне будет крайне сложно превзойти документацию, изучение которой я крайне рекомендую. docs.spring.io/spring-security/site/docs/current/reference/html5/ Цель видео - дать самое базовое представление и практический навык работы с технологией.
@elnar_1206
@elnar_1206 3 ай бұрын
Спасибо за отличный урок🔥🔥🔥
@EugeneSuleimanov
@EugeneSuleimanov 3 ай бұрын
Спасибо за отзыв!
@БогданСамойленко-ь5н
@БогданСамойленко-ь5н 5 жыл бұрын
Спасибо, не пропадайте больше!)
@EugeneSuleimanov
@EugeneSuleimanov 5 жыл бұрын
Спасибоза отзыв. Постараюсь )
@ДавидКостандян-п6о
@ДавидКостандян-п6о 2 жыл бұрын
Спасибо большое! Не смотря на длительность было очень интересно смотреть)
@EugeneSuleimanov
@EugeneSuleimanov 2 жыл бұрын
Спасибо за отзыв :)
@АртемБогуш-е3л
@АртемБогуш-е3л 4 жыл бұрын
Большущее тебе спасибо, бро! Доходчиво, понятно, супер. Очень сильно жизнь облегчило, как раз пишу дипломный по курсах...
@axelrod4840
@axelrod4840 4 жыл бұрын
Евгений, спасибо за видео урок. Как можно реализовать refresh token на базе этого rest api?? буду очень благодарен
@johnmarrewood
@johnmarrewood 2 жыл бұрын
Похоже ответа не будет(
@olexandr_kiss
@olexandr_kiss 4 жыл бұрын
Не мог не отписать. Очень грамотно сделано и подано. Спасибо.
@EugeneSuleimanov
@EugeneSuleimanov 4 жыл бұрын
Спасибо за отзыв!
@overlordofprogramminglangu7822
@overlordofprogramminglangu7822 4 жыл бұрын
Спасибо большое за объяснение столь важной темы)
@alexhali6003
@alexhali6003 3 жыл бұрын
Все отлично, есть несколько пожеланий: 1. Autowired над конструктором можно не вешать, т.к. других конструкторов нет и при создании бина Spring сам поймет что инжектить. 2. Аннотация @AllArgsConstructor, как уже писали - сильно поможет. 3. В имплементации UserDetails сильно нужны @AllArgsConstructor и @Data, т.к. отвлекает генерация геттеров\сеттеров. 4. Публичный конструктор без параметров в фабрике не нужен, javac сам подсунет если не найдет. 5. Было бы неплохо добавить вариант ограничения доступа через аннотации, типа @RolesAllowed/@Secured
@jakhara4202
@jakhara4202 3 жыл бұрын
Спасибо вам большое за ваш труд. Лучшей материал на KZbin по этой теме СУПЕР.
@EugeneSuleimanov
@EugeneSuleimanov 3 жыл бұрын
Спасибо за отзыв!
@ShulV
@ShulV Жыл бұрын
Не слишком сложно и не слишком легко. То, что нужно!
@EugeneSuleimanov
@EugeneSuleimanov Жыл бұрын
Спасибо за отзыв!
@ДмитрийИванов-х5л6у
@ДмитрийИванов-х5л6у 4 жыл бұрын
Отлично объясняешь, видео очень помогло, большое человеческое тебе, друг)
@EugeneSuleimanov
@EugeneSuleimanov 3 жыл бұрын
Спасибо за отзыв! Рад, что материал оказался полезен.
@valeralemberov2853
@valeralemberov2853 2 жыл бұрын
Очень круто. Ты красава!!!!
@EugeneSuleimanov
@EugeneSuleimanov 2 жыл бұрын
Спасибо за отзыв!
@veli2698
@veli2698 4 жыл бұрын
Подскажите, почему не используете DI для JwtTokenFilter и JwtTokenProvider, а создаете их вручную? Можно ли так же аннотировать эти классы через @Component и заменить все new на инжект через DI?
@ErikGhukasyan
@ErikGhukasyan 4 жыл бұрын
Спасибо большое за видеоурок. Он мне очень помог. Не пропадайте ;)
@EugeneSuleimanov
@EugeneSuleimanov 4 жыл бұрын
Спасибо за отзыв! Постараюсь)
@ОлегЗылевич-р5ж
@ОлегЗылевич-р5ж 11 ай бұрын
Отличный выпуск) спасибо за ваш труд)
@EugeneSuleimanov
@EugeneSuleimanov 11 ай бұрын
Спасибо за отзыв!
@EugeneSuleimanov
@EugeneSuleimanov 11 ай бұрын
Спасибо за отзыв!
@АлександрБугримов-о1е
@АлександрБугримов-о1е 4 жыл бұрын
Очень классное виде! Очень жаль, что таких больше не выпускаете
@eugenevolohonsky1469
@eugenevolohonsky1469 Жыл бұрын
Нашел хорошее видео на ту же тематику, но уши кровоточат от чудовищного каверканья английских терминов. Как же приятно слушать Евгения
@EugeneSuleimanov
@EugeneSuleimanov Жыл бұрын
Спасибо за отзыв!
@ВалераДементьев-н6з
@ВалераДементьев-н6з 4 жыл бұрын
Как это все сделать с решрештокеном?
@ЕвгенийГруздов-г1м
@ЕвгенийГруздов-г1м 3 жыл бұрын
@ Eugene Suleimanov Огромное спасибо за данный урок! Подскажите каким образом можно токен сделать недействительным, выполнив logout. Как я понял можно создать сущность "чёрный список" для JWT токенов, но как правильно реализовать до меня не доходит. Или для этого и существует Auth 2.0 и работа с ним? Накиньте пожалуйста мыслей!
@4val0v
@4val0v 5 жыл бұрын
Евгений, у вас лучшие ролики, доходчиво и без воды, жаль что видео приходится ждать месяцами :( Также мне очень хотелось бы увидеть продолжение данного ролика с использованием mapstruct
@EugeneSuleimanov
@EugeneSuleimanov 5 жыл бұрын
Спасибо за отзыв, Андрей. Постараюсь выложить вторую часть в течение нескольких недель (обновление токена, регистрация и т.д.)
@4val0v
@4val0v 5 жыл бұрын
@@EugeneSuleimanov Это хорошие новости, будем ждать, спасибо большое
@antontevs
@antontevs 4 жыл бұрын
Субъективно, Flyway по удобней будет для миграции, и понятный sql, а не xml.
@alexpodshivalov1010
@alexpodshivalov1010 3 жыл бұрын
Превосходное видео и объяснения. Было бы здорово для полноты катрины добавить регистрацию пользователя в этом же проекте. Если есть такое видео, то поделитесь пожалуйста ссылкой
@ololo2274
@ololo2274 4 жыл бұрын
Здравствуйте ) А как интегрировать liquibase в Spring MVC, чтобы при запуске приложения создавались таблицы в БД? Я пытаюсь сконфигурировать плагин со всеми настройками и там указать путь к файлу changelog.xml. Но таблицы не создаются.
@odilbekrahmonov1584
@odilbekrahmonov1584 3 жыл бұрын
Спасибо за урок мне очень понравилось
@EugeneSuleimanov
@EugeneSuleimanov 3 жыл бұрын
Спасибо за отзыв!
@engend3405
@engend3405 Жыл бұрын
Спасибо , как всегда круто)
@xz8928
@xz8928 Жыл бұрын
А зачем вручную создавать таблицы,если jpa автоматически создаст их?
@sear5126
@sear5126 Жыл бұрын
Рекомендую вам в дальнейшем использовать Lombok, удобная тула для того чтобы избавиться от явной прописи конструкторов геттеров и сеттеров (если вкратце)
@alexpodshivalov1010
@alexpodshivalov1010 3 жыл бұрын
Очень долго пытался разбраться почему не работает jwtTokenProvider так и не смог. Постоянно получаю различные исключения при разных ситуациях. Так и не могу ни как заставить его работать
@roebinin
@roebinin Жыл бұрын
@50:14 Очень понравился материал. Однако, не разумнее затолкать инициализацию бина passwordEncoder в корень конфигурации проекта, а не в отдельном (пусть и магистральном) компоненте JwtTokenProvider?
@ALexus6192
@ALexus6192 Жыл бұрын
У меня вообще ошибка выпадает, что не может найти такой бин
@ВикторБречко-щ6ф
@ВикторБречко-щ6ф 4 жыл бұрын
Добрый день! Как отправить POST запрос для создания нового пользователя и сохранения его в базе, если еще никакой пользователь не авторизован?
@iorgankrat1118
@iorgankrat1118 3 жыл бұрын
спасибо вам, очень круто
@Chron4ik
@Chron4ik 3 жыл бұрын
Шикарный видос!
@МаксимПалий-я4п
@МаксимПалий-я4п 5 жыл бұрын
С возвращением!)
@EugeneSuleimanov
@EugeneSuleimanov 5 жыл бұрын
Спасибо)
@eugenevolohonsky1469
@eugenevolohonsky1469 Жыл бұрын
Попробовал сделать такую же авторизацию на тестовом проекте и столкнулся с тем, что отсутствует WebSecurityConfigurerAdapter. В последних версиях Spring Security его нет. Целый день пытаюсь адаптировать пример из видео под использование без адаптера. Будет ли подобное видео с новой версией секьюрити или разбор что изменилось и как теперь с этим работать?
@EugeneSuleimanov
@EugeneSuleimanov Жыл бұрын
@Configuration @EnableWebSecurity public class SecurityConfig { @Autowired private JwtAuthenticationFilter jwtAuthenticationFilter; @Autowired private CustomUserDetailsService customUserDetailsService; @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder()); } @Bean public JwtAuthenticationFilter jwtAuthenticationFilter() { return new JwtAuthenticationFilter(); } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/auth/**").permitAll() .antMatchers("/api/**").authenticated() .and() .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } } Это примерно. Т.е. используются аннотации и SecurityFilterChain. Это должно помочь.
@eugenevolohonsky1469
@eugenevolohonsky1469 Жыл бұрын
@@EugeneSuleimanov спасибо!
@ВладиславМелехин-е5р
@ВладиславМелехин-е5р 4 жыл бұрын
Круто.
@qweezique
@qweezique 2 жыл бұрын
Большое спасибо!
@EugeneSuleimanov
@EugeneSuleimanov 2 жыл бұрын
Спасибо за отзыв!
@yaqubaliyev8245
@yaqubaliyev8245 Жыл бұрын
"toor" Молодец Женя😁
@sergios7777
@sergios7777 2 жыл бұрын
Все хорошо, конечно, слов нет, большое спасибо! Но было бы совсем замечательно, если бы Евгений каждый момент, который он называет "ну, тут все понятно", хотя бы в двух словах пояснял. Потому что, если я пришел смотреть такое длинное видео, значит я просто не знаю, как в принципе реализовать Security на Spring с JWT. Приходится гуглить все не пояснённые моменты типа что такое grantedauthority и simplegrantedauthority и еще несколько вещей. А тем кому все эти моменты понятны, он точно не будет тратить 1,5 часа на видео. Я ничего против сказать не хочу, абсолютно весь материл Евгения просто бестселлер, браво! Поэтому когда я искал в youtube как реализовать Spring Security with JWT и увидел Евгения, с радостью начал смотреть, так как уже знаком с высоким профессионализмом этого замечательного человека и программиста, а данный комментарий -- просто рекомендация.
@EugeneSuleimanov
@EugeneSuleimanov 2 жыл бұрын
Спасибо за отзыв, Сергей! На канале есть более подробное видео по основам Spring Security: kzbin.info/www/bejne/babbg4KAZtOXq80 Надеюсь, оно будет более полезно. И спасибо за рекомендацию.
@sergios7777
@sergios7777 2 жыл бұрын
@@EugeneSuleimanov Огромное спасибо, завтра займусь изучением!
@СамирШахмурадлы
@СамирШахмурадлы 4 жыл бұрын
Спасибо большое! Сделайте, пожалуйста, курс по микросервисам, докеру)
@EugeneSuleimanov
@EugeneSuleimanov 4 жыл бұрын
Это соль на рану. Уже крайне давно хочу записать серию подобных видео, но не хватает времени, к сожалению... (( Крайне надеюсь, что в этом году получится. Спасибо.
@СамирШахмурадлы
@СамирШахмурадлы 4 жыл бұрын
@@EugeneSuleimanov Удачи!
@tobikron
@tobikron 2 жыл бұрын
32:35 Хорошо) мой перфекционист в душе: ну что же тут хорошего, где передаваемый параметр? 😁
@alexsnowden7077
@alexsnowden7077 5 жыл бұрын
Евгений спасибо большое за ваши видео. В них всегда можно чему то научиться. Такой вопрос: у вас есть опыт работы с чем то реактивным spring web flux или просто rxjava? Было бы супер увидеть от вас видео на такую тему.
@EugeneSuleimanov
@EugeneSuleimanov 5 жыл бұрын
Спасибо за отзыв, Alex.Да, конечно. Я подумаю, что можно сделать на эту тему.
@brsbrs9275
@brsbrs9275 3 жыл бұрын
Евгений, спасибо за урок! Вопрос: если мы маппим юзеров и роли через @ManyToMany, то в итоге получаем три таблички (users, roles, users_roles), однако, если мы сделаем @ManyToOne, то у нас будет только две таблицы (users, user_role(Id, user_id, role) и нужно указать уникальную связку user_id+role). Есть ли между этими подходами принципиальная разница и, если есть, то какой лучше?
@EugeneSuleimanov
@EugeneSuleimanov 3 жыл бұрын
В данном случае - нет, но, тогда мы не сможем присвоить юзеру несколько ролей. Это, не критично, потому что мы можем дать каждой роли определённые права (добавить коллекцию пермишенов, например). Сказать, какой лучше сложно, но, я бы использовать @ManyToOne в реальной жизни.
@sergiisavin5633
@sergiisavin5633 5 жыл бұрын
very good tutorial!
@EugeneSuleimanov
@EugeneSuleimanov 5 жыл бұрын
Спасибо за отзыв, Сергей.
@FoxChpoks
@FoxChpoks 2 жыл бұрын
При отсутствии в заголовке токена необходимо возвращать 401 Unauthorized, а не 403 Forbidden. В данной имплементации, к сожалению, всегда 403.
@budha_rain
@budha_rain Жыл бұрын
Спасибо
@adlhbgreqk
@adlhbgreqk 3 жыл бұрын
А почему классам User и Role нельзя сразу имплементировать интерфейсы UserDetails и GrantedAuthority соответственно?
@valeriyemelyanov9090
@valeriyemelyanov9090 4 жыл бұрын
Прохожу аутентификацию, получаю токен. У get запроса в header "Authorization" помещаю Bearer_токен. Посылаю запрос. Получаю ответ 403 Forbidden. Как искать ошибку? По точкам останова никуда не попадаю.
@МаксимВорочаев
@МаксимВорочаев 4 жыл бұрын
Решили? Та же проблема сейчас) Если решили, отпишитесь плз
@valeriyemelyanov9090
@valeriyemelyanov9090 4 жыл бұрын
@@МаксимВорочаев Решил, не помню точно что было. Что то тривиальное, неправильно набрал текст (не тот класс, не тот метод, ...). Нашел чисто визуально через некоторое время. Вопрос как это отловить отладкой остался.
@МаксимВорочаев
@МаксимВорочаев 4 жыл бұрын
@@valeriyemelyanov9090 роли должны быть не ADMIN а ROLE_ADMIN) И всё)
@firewatermoonsun
@firewatermoonsun 2 жыл бұрын
1:10:15 При вводе неправильного пароля "throw new BadCredentialsException("Invalid username or password");" кажется не сработал? Не вижу этого сообщения в json response.
@kassymbekoff
@kassymbekoff 3 жыл бұрын
Спасибо за урок! Когда истекает срок jwt token-а spring возвращает html страницу, а надо ведь json, пробовал ControllerAdvice, результата нет, пока ищу ответ. Как можно это решить?
@PP-hn9vq
@PP-hn9vq 2 жыл бұрын
спасибо за шикарный видос) даже код есть, мечта))) чуть бы код покрупнее.
@timyp64
@timyp64 2 жыл бұрын
А как можно совместить авторизацию с вводом пароля и логина + csrf токен(стандартную для спринг секьюрити) и jwt для подальшего использования (после авторизации) при отправке запросов на сервер? Подскажите.
@petrovandrey9735
@petrovandrey9735 Жыл бұрын
Евгений, спасибо огромное за Ваш труд! Спустя годы контент все равно остается полезным и актуальным! Проясните пожалуйста несколько вопросов по видео: 1) 38:58 А зачем все-таки этому классу пустой конструктор по умолчанию? И можно здесь же пояснить зачем именно сделали класс final (т.е. в чем будет проблема если он будет не final)? 2) 42:15 почему User.roles нужно копировать в new ArrayList перед конвертацией в GrantedAuthorities (строка 26)? 3) 57:12 Зачем переопределять метод authenticationManagerBean ничего не меняя по сути в имплементации, а только вызывая super (т.е. он и без этого будет создан спрингом и вести будет себя точно так же)?
@engend3405
@engend3405 Жыл бұрын
Привет. 1) Видео сделано давно , есть неточности и чтобы их поправить , придется повозиться. 2) По пункту 1, 2 согласен. 3) Возможно, при создании своей аутентификации , ты обязан явно внедрить бин AuthenticationManager в AuthenticationRestControllerV1, поэтому в конфигурационном классе его как раз и создаешь (без всяких super. и само собой не переопределяя , хотя раньше нужно было). * В целом крутой материал , как всегда - спасибо)
@lehatalant9878
@lehatalant9878 Жыл бұрын
Прошло уже какое-то время, но могу ответить на второй пункт. Копирование делается на тот случай, если мы роли храним не в List, а в Set. Недавно столкнулся с этим пока практиковался и теперь запомню на долго)
@petrovandrey9735
@petrovandrey9735 Жыл бұрын
@@lehatalant9878 поясни плиз в чем именно может быть проблема даже если где-то Set будет?
@lehatalant9878
@lehatalant9878 Жыл бұрын
@@petrovandrey9735, Spring Security работает только с List и если мы вставим Set, тогда появится ошибка.
@petrovandrey9735
@petrovandrey9735 Жыл бұрын
Понял, спасибо!
@belysheva80
@belysheva80 4 жыл бұрын
Спасибо большое за видео! Подскажите, пожалуйста, а если у нас LDAP авторизация, подход остается тот же?
@volandio
@volandio 5 жыл бұрын
Лайк ещё до просмотра)
@EugeneSuleimanov
@EugeneSuleimanov 5 жыл бұрын
Спасибо :)
@Flawden
@Flawden Жыл бұрын
Офигенно
@EugeneSuleimanov
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий :)
@ВасилийГоловко-д9и
@ВасилийГоловко-д9и 4 жыл бұрын
если уже используешь ломбок, то можно юзать аннотации @RequiredArgsConstructor, чтобы не писать конструктор
@АлинаИванова-ф3о
@АлинаИванова-ф3о 4 жыл бұрын
может, ради Autowired
@alexandarv.2688
@alexandarv.2688 5 жыл бұрын
Сделай пожалуйста еще видео о создании фронтенда на реакте для этого проекта.
@ram0973
@ram0973 3 жыл бұрын
лучше на ангуляре :)
@BigBigLeo
@BigBigLeo 3 жыл бұрын
@@ram0973 нет, на реакте лучше)
@ram0973
@ram0973 3 жыл бұрын
@@BigBigLeo обычно на C#\Java проекты на ангуляре 😉
@BigBigLeo
@BigBigLeo 3 жыл бұрын
@@ram0973 Да, это было так, пока Angular не устарел :D
@ram0973
@ram0973 3 жыл бұрын
@@BigBigLeo оО а он уже устарел?
@turkmenperson681
@turkmenperson681 4 жыл бұрын
Спасибо за Урок, лучшая объяснения)) Вопрос, можешь снимать урок где добавляешь возможность logout и remember me???)
@Igorch81
@Igorch81 2 жыл бұрын
Спасибо за отличный урок! Просьба разъяснить насколько это хороший тон или насколько это актуальный подход, что при каждом REST запросе идет обращение в базу для получения данных пользователя. Разве не требуется поместить эти данные в claims? Спасибо!
@Alex-qy9zm
@Alex-qy9zm 4 жыл бұрын
Четко!
@Ackois
@Ackois 3 жыл бұрын
Добрый день! Проясните, пожалуйста, такой момент. В методе контроллера login вызывается authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, requestDto.getPassword())); При этом, насколько я понял, используется дефолтный AuthenticationManagerDelegator в качестве реализации. Если так, то в каким образом он понимает, как валидировать пароль при логине? То есть как связаны конкретно ваша таблица с паролями и сущность authenticationManager?
@VDHCUR
@VDHCUR 3 жыл бұрын
Спасибо за видео! Делаю по вашему примеру и возникла проблема: при отправке невалидного токена JwtAuthenticationException возвращает HTML вместо JSON. AuthenticationEntryPoint перехватывает эту ошибку, только в случае пустого токена, при каких либо данных в токене возвращается HTML. Подскажите, как это можно обработать, а то уже который день над этим бьюсь) Заранее спасибо :)
@kassymbekoff
@kassymbekoff 3 жыл бұрын
Разобрались?) Я тоже на этом застрял))
@aojona
@aojona Жыл бұрын
В данной реализации при каждом обращении пользователя фильтр JwtTokenFilter через jwtTokenProvider обращается к базе данных, и тем самым, сводит преимущества JWT токенов на нет. Чтобы это исправить, нужно переписать метод getAuthentication так, чтобы он собирал объект Authentication на основе тех данных, которые есть в самом токене (Claims). Поправьте меня, если ошибаюсь. А так большое спасибо за Ваш видео урок!
@EugeneSuleimanov
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий! Да, вы правы, мы могли бы сделать и так. Здесь единственное преимущество в том, что изменение статуса мгновенно отразится на аутентификации.
@Shikarno_3000
@Shikarno_3000 Жыл бұрын
Евгений, Доброго дня вам. Может у вас будет секундочка, поделиться вашим опытом. При версии выше java 8 TextCodec.BASE64.decode нужного класса не находит, т.к. он из Java EE как я понял, но все же добавить библиотеку jaxb-api не сложно и все работает. Если вы делали подобное на версиях выше Java 8, есть ли какой-то другой подход ? Какие-то новые технологии ? Если кому-то требуется чтобы работало выше чем на Java 8, добавьте в POM dependency javax.xml.bind jaxb-api 2.3.0 com.sun.xml.bind jaxb-impl 2.3.0 com.sun.xml.bind jaxb-core 2.3.0 javax.activation activation 1.1.1
@markifive
@markifive 2 жыл бұрын
Евгений спасибо за ролик по нём написал свой первый jwt для своего проекта. Но мне не совсем ясно зачем админу давали роль и админа и юзера ? Для ендпоинта админа дали роль админа для всех остальных запросов у нас authenticated же есть.
@EugeneSuleimanov
@EugeneSuleimanov 2 жыл бұрын
Спасибо за отзыв! Даётся набор ролей для гибкости, так как здесь не используются пермишены. В нормальной практике - будет одна роль с набором доступов.
@markifive
@markifive 2 жыл бұрын
@@EugeneSuleimanov но если бы мы админу не дали права USER он бы смог всё равно пользоваться всеми запросами согласно нашей конфигурации. Верно ?
@МихаилГорбунов-ц5у
@МихаилГорбунов-ц5у Жыл бұрын
Спасибо за видео, очень наглядно и полезно. Возник такой вопрос: как можно перехватить JwtAuthenticationException, чтоб на условный фронт возвращался не код 500, а можно было вернуть 401 или 403?
@EugeneSuleimanov
@EugeneSuleimanov Жыл бұрын
Спасибо за отзыв! Через глобальный обработчик ошибок.
@User-pg2os
@User-pg2os 2 жыл бұрын
Добрый день! Проясните, пожалуйста, такой момент. В методе контроллера login вызывается authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, requestDto.getPassword())); Какая реализация используеться для authenticationManager? Каким образом он понимает, как валидировать пароль и логин? Спасибо заранее!
@artemryvkin6885
@artemryvkin6885 2 жыл бұрын
а где реализация RoleRepository и UserRepository? это же только интерфейсы. Может я что то упустил конечно ... Там нет бинов для этих объектов. При запуске проекта ошибка вылетает
@nikolaykalmykov9025
@nikolaykalmykov9025 3 жыл бұрын
Добрый день. Отличная работа, очень благодарен. Но возникает один вопрос. Как данный сервис использовать между всеми докеризированными микросервисами? Не создавать же отдельный jwt server для каждого. Должно быть решение.
@МихайлоСавченко-р4э
@МихайлоСавченко-р4э 4 жыл бұрын
спасибо!
@hrachkhachatryan3006
@hrachkhachatryan3006 4 жыл бұрын
zdrastvuy uvajaemi Eugene , spasibo bolshoe chto delishsya svoim opitom i znaniem s nami) prosto malenkaya prosba k tebe, font size nemnojko uvelichivay
@Shikarno_3000
@Shikarno_3000 Жыл бұрын
Добрый день, Евгений, все больше углубляюсь в понимание Spring Security, и почитав много документации и разобрав Ваш пример, у меня возник вопрос: Исхожу из посыла, что токен придуман для общения между серверами, чем между пользователями и сервером, чтобы постоянно не брать аутентификацию из сесии ,а там из контекста. и как я понял фронт может обойтись без файлов куки. Тем самым токен позволяет не использовать сессии и как я понял использовать аутентификацию только 1 раз если у пользователя нету токена, чтобы его выдать, а в дальнейшем только проверять токен и тем самым ускорять работу. Само собой, если кто-то украдет токен, и без лишней проверки на аутентификацию, то будет серверу плохо. Но все же, 1. Вопрос. Почему в классе JwtTokenFilter в методе doFilter вы проверяете токен , и если с токеном все хорошо, вы создаете аутентификацию, опять проверяя существует ли юзер в базе данных? но прибегая к обычному UserDetails , если вы используете до этого JwtUser который имплементирует userdetails.Возможно в JwtTokenProvider должен был инжектиться не UserDetailsService, а JwtUserDetailsService? 2. Вопрос Вместо проверки Аутентификации в сесии, мы в том же методете ее устанавливаем каждый раз после проверки токена. Зачем мы это делаем если с токеном все впорядке? почему мы не может пропустить данный пункт(если это еще один пособ проверки, то вопрос исчерпан), и там же мы проводим проверку на null, как аутентификация может быть null, если валидный токен к нам пришел ? 3. Вопрос В контольлере , /login Вы проводите аутентификацию с помощью AuthenficationManager, и если она проходит, то соответственно Вы выдаете токен. Насколько я понял аутентификация происходит автоматически, в остальных методах вы проверку не проводите в ручную, а так же вы не проводите проверку токена, это мне тоже совсем не понятно. Я понял что вы добавили новый фильтр перед аентентификацией, но как его пройти, если токена нету ? Фильтр первый увидел токена нету, включает следующий UsernamePasswordAuthenticationFilter ? Меня не покидает ощущение что нужно было заоверайдить AuthMeneger на новый провайдер, который связан с JwtTokenProvider и JwtUserDetailsService, или нельзя базовую аентентификацию переписывать на JWTToken? поясните этот момент, пожалуйста. Извините, если плохо изложил свои мысли, но данные моменты не дают покоя моей голове, если я что-то не правильно понял о процессе security, разъясните пожалуйста, или дайте ссылку на понимания данного момента.
@EugeneSuleimanov
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий! 1. JwtUserDetailsService является реализацией UserDetailsService. 2. В целом, мы могли бы пропустить этот этап. Но иногда мы делаем это, для обработки случаев блокировки юзера. Т.е. есть токен на месяц. Человека заблокировали в БД, но токен еще валиден. И человек сможет иметь доступ к системе. 3. Login выдает токен, в остальных местах, мы его проверяем в рамках аутентификации. Надеюсь, я верно понял ваши вопросы и смог на них ответить.
@Shikarno_3000
@Shikarno_3000 Жыл бұрын
@@EugeneSuleimanov Большое спасибо за уделенное мне время, теперь все устаканилось в голове.
@mohen-tohen
@mohen-tohen 2 жыл бұрын
а как с помощью сервиса авторизации получать доступ к другим сервисами, которые находятся вне сервиса авторизации?
@АнтонВаськин-б1б
@АнтонВаськин-б1б 2 жыл бұрын
Спасибо! Но , сложновато , конечно ... долго писали базу и модель , в итоге , что касается security , видимо, автор подустал и пошла спешка
@leetcode_over_khinkali
@leetcode_over_khinkali 3 жыл бұрын
С транзакционными методами в сервисах падает: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'springSecurityConfig': Unsatisfied dependency expressed through field 'jwtTokenProvider'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.security.jwt.JwtTokenProvider' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier("jwtTokenProviderImpl")}
@GoPetr
@GoPetr 5 жыл бұрын
Спасибо Вам! В ру сегменте очень не хватает качественных уроков! Будет ли ещё видео, так как от Вас год ждал видео))
@EugeneSuleimanov
@EugeneSuleimanov 5 жыл бұрын
Спасибо за отзыв, Александр ) Постараюсь выкладывать чаще. Сейчас работаю над серией видео по Java 11. Но, основная работа занимает много времени. Постараюсь к середине лета добить Java 11 и выложить.
@GoPetr
@GoPetr 5 жыл бұрын
@@EugeneSuleimanov лучше spring. Все же большинство людей смотрят, что бы устроиться на работу. Посмотрите на сегмент хибернейта, спринга. Его практически нет. Мало кто хороше рассказывает. И критически мало видео где создают свое веб приложение. Я знаю только ОДНОГО автора который создаёт свое приложение, но все же не совсем для новичков. Не разжёвывает. Вот у вас выходит ещё. Но и все.
@EugeneSuleimanov
@EugeneSuleimanov 5 жыл бұрын
@@GoPetr как вариант. Spring 5 есть заготовки, возможно, переключусь на этот цикл видео. Спасибо за совет
@GoPetr
@GoPetr 5 жыл бұрын
@@EugeneSuleimanov было бы круто! Спасибо!
@4val0v
@4val0v 5 жыл бұрын
@@EugeneSuleimanov Также за Spring Boot, по Java 11 другие блогеры расскажут, а вот второго Евгения нету на KZbin который также круто будет по spring учить ;)
@AquaChanneOne
@AquaChanneOne 4 жыл бұрын
Спасибо огромное за видео! Возник вопрос: когда пишу в AuthenticationRestControllerV1 аннотацию Autowired у конструктора, то authenticationManager подсвечивается красным и пишет: No beans of "AuthenticationManager" type not found. В чём может быть причина?
@AquaChanneOne
@AquaChanneOne 4 жыл бұрын
Если у кого-то была такая ошибка, то она возникает по причине того, что в SecurityConfig у authenticationManager() нужно добавить @Bean
@EugeneSuleimanov
@EugeneSuleimanov 4 жыл бұрын
Спасибо за отзыв. Если работает корректно, то вероятнее всего, проблемы в настройках idea. Если нет - нужно поискать ошибку в коде. Особенно, аннотации.
@EugeneSuleimanov
@EugeneSuleimanov 4 жыл бұрын
@@AquaChanneOne только сейчас увидел ответ
@AquaChanneOne
@AquaChanneOne 4 жыл бұрын
@@EugeneSuleimanov Можно ещё вопрос спросить: Открыл ваш проект, ничего не менял, в нём ошибка возникает в классе JwtTokenProvider у поля userDetailsService: Could not autowire. There is more than one bean of 'UserDetailsService' type. Beans: inMemoryUserDetailsManager (UserDetailsServiceAutoConfiguration. class) С чем это может быть связано? Также и у меня в моём проекте, который я создавал параллельно вашему видео, такая же ошибка.
@ВадимВалунский
@ВадимВалунский 4 жыл бұрын
@@AquaChanneOneОшибка с authenticationManager, в моем случае, возникла, потому что забыл на класс SecurityConfig повесить аннотацию @Configuration
@Shikarno_3000
@Shikarno_3000 Жыл бұрын
Ролики супер, огромное спасибо, но запускайте свои проекты пожалуйста перед Push'ем на гит , а то со скаченного проекта с гитхаба выходит карусель при создании бинов, я конечно ее решил, и тем самым понял ваш урок еще лучше, может быть вы так и планировали ?)))
@EugeneSuleimanov
@EugeneSuleimanov Жыл бұрын
Заливал довольно давно и на тех версиях и в той конфигурации, насколько я помню, это работало. Если нет, то прошу прощения за неудобства. P.S.: если там ошибка, то это мой фол, а не хитрый план :)
@iesoveev
@iesoveev Жыл бұрын
Механизм JWT буквально кричит о том, что не нужно ходить в базу при каждом запросе на сервер. Он хранит информацию о пользователе в самом себе. ..........
@ДанилКлименко-я8т
@ДанилКлименко-я8т 4 жыл бұрын
Здравствуйте, Евгений. Возможо, где то просмотрел, но не могу найти связть между hasRole("Admin") и записью ROLE_ADMIN, которую мы добавили в базу. Как происходит проверка на админа, как спринг узнает, что этот пользователь админ? Спасибо.
@EugeneSuleimanov
@EugeneSuleimanov 4 жыл бұрын
Добрый вечер, Данил. Это "вшитая" логика spring security
@4val0v
@4val0v 5 жыл бұрын
Еще хотелось бы узнать ответ на такие вопросы: В BaseEntity.java класс должен быть abstract ? (У вас просто public class BaseEntity)
@EugeneSuleimanov
@EugeneSuleimanov 5 жыл бұрын
Не обязательно, но можем сделать и абстрактным. Здесь нет методов, которые были бы нам нужны абстрактными, только общие поля. Поэтому - обычный класс
@alexandrugrubneac4199
@alexandrugrubneac4199 3 жыл бұрын
@Eugene Suleimanov: Благодаря Вашим видео учусь писать правильно код. Спасибо за это огромное. Вопрос: В чем смысл аннотации @Table @Column если имя совпадает с названием таблицы/столбца ?
@EugeneSuleimanov
@EugeneSuleimanov 3 жыл бұрын
Это не обязательно, но, обычно, именуют, просто как договоренность. Это на основании моего опыта. Спасибо за отзыв!
@ВалераДементьев-н6з
@ВалераДементьев-н6з 4 жыл бұрын
Что-бы юзеру фабрику не городить можно в userDetailIml просто положить полем appUser и с него уже выдать все поля геттерами
@aoveden197727
@aoveden197727 3 жыл бұрын
Евгений, уроки отличные. Но надо сделать хороший звук (здесь он глухой и не заднем плане где-то) и картинку с кодом крупнее.
@EugeneSuleimanov
@EugeneSuleimanov 3 жыл бұрын
Спасибо, да,есть проблем, стараюсь исправить в новых видео.
@aoveden197727
@aoveden197727 3 жыл бұрын
@@EugeneSuleimanov где можно вам задать вопросы по этому проекту? На первом же запуске, когда ещё БД пустая, выдаёт ошибку. Дальше писать не рабочее приложение не интересно. Есть какой-нибудь оперативный вариант связи с вами?
@vladimirpopov8790
@vladimirpopov8790 3 жыл бұрын
Благодарю за видео! разбираю сейчас данную тему. не могу понять в каком месте spring security сверяется с базой данных? у меня BadCredentialsException на строчке authenticationManager.authenticate.. база данных postge
@AXE0707
@AXE0707 4 жыл бұрын
Евгений спасибо большое за видео. На текущий момент это единственное видео, которое мне помогло добавить авторизацию с jwt. У меня есть небольшой пет проект с Spring Boot и Angular, где я успешно внедрил данную технологию, но так же у меня остались вопросы в частности о том как создавать refresh токен и как с ним работать. Но больше всего мне интересно как работать с Oauth2 и как совместить его с jwt. Как бы я не старался, у меня не получается совместить их вместе из-за очевидной нехватки знаний и опыта в этих технологиях. Как сделать так, что при запросе с сервера Angular по REST пришел запрос на сервер Spring и Spring обратился к внешнему серверу(Facebook, Google etc, на которых у меня заранее установлено приложение и известны все данные в виде секретного ключа и так далее) и получил от них ответ в виде данных пользователя, который потом передаст по REST другому серверу(Angular). Такая же схема работы с jwt и по сути они отличаются только тем, что от внешнего сервера(Angular) в случае авторизации через Oauth2 запрос приходит с пустым телом(т.к. нет ни пароля ни логина, они вводятся на стороннем 3м сервере). В конченом итоге я хочу реализовать авторизацию пользователя на выбор: или через внутреннюю самого сайта, или через внешнюю(Facebook, Google etc). Все эти сведения только лишь теоретические. Как это реализовать? Куда смотреть-хотя бы на каких ресурсах внятно это объясняется или я не так понимаю, ибо чем больше я ищу информации про REST авторизацию с Oauth2, тем больше у меня возникает вопросов. В идеале хотелось бы увидеть Ваше видеоруководство на подобии текущего, где будет освещенная данная проблема, т.к. я считаю данный вопрос не является каким то частным случаем, на каждом современном веб-ресурсе присутствует авторизация двумя вышеперечисленными способами. Даже на украинском гос.сайте по оплате ЖКХ услуг есть авторизация через гитхаб.
@EugeneSuleimanov
@EugeneSuleimanov 4 жыл бұрын
Спасибо за ваш отзыв! Что касается OAuth, то мне кажется, здесь важно понять сам принцип этого подхода (кто именно проверяет безопасность в данном случае). Пока в планах нет выкладывать видео по данной теме, но, мне кажется, что уже есть готовые примеры
@Multi111111112
@Multi111111112 Жыл бұрын
100% уже неактуально для автора вопроса, но для ищущих информацию может быть полезно. Шестое издание "Spring в действии" помогает в реализации по данной тематике. Глава 5.3.3.
@ДенисАдмин-г6ц
@ДенисАдмин-г6ц 2 жыл бұрын
Здравствуйте, Евгений! Может подскажите как перехватывать исключения внутри пакета jwt. ControllerAdvice - перехватывает только все то находится на уровне контроллеров =(. А вот фильтрация происходит раньше, и вот как перехватить исключения ума не приложу Может сталкивались с этим?
@EugeneSuleimanov
@EugeneSuleimanov 2 жыл бұрын
Добрый день! Если вы знаете конкретное исключение, то просто через глобальный обработчик можно сделать. reflectoring.io/spring-boot-exception-handling/
@Oleksandr-ji4mt
@Oleksandr-ji4mt 5 жыл бұрын
Здравствуйте, очень хочется узнать Ваше мнение по поводу построение большого REST приложения по правилам хорошего тона. Есть ли смысл и правильно ли использовать использовать entitiy класы и для бизнес логики и для представления, или же последнее заменять так званными проекциями в spring фреймворке? Как я понимаю entity классы отвечают за представление таблицы базы данных, и использовать эти классы в качестве представление не есть хорошо. Хотелось бы узнать это от более опытного разработчика.
@EugeneSuleimanov
@EugeneSuleimanov 5 жыл бұрын
Добрый день, Александр. Если делаем с нуля, то я бы использовал DTO или graphQL. Есть некоторые ситуации, когда передача самих объектов может подвести. Это, если в общих чертах.
@Oleksandr-ji4mt
@Oleksandr-ji4mt 5 жыл бұрын
@@EugeneSuleimanov Спасибо за ответ!
@romanmekelyta4640
@romanmekelyta4640 5 жыл бұрын
Женя у меня не находит authenticationManager бина.( в AuthenticationRestController в конструкторе есть, автоваред стоит.((
@Gibsonen
@Gibsonen 5 жыл бұрын
так это не бин
@AquaChanneOne
@AquaChanneOne 4 жыл бұрын
Привет! нашёл причину?
@aydinkadyrov
@aydinkadyrov 2 жыл бұрын
Спасибо! А есть ли пример для микросервисов?
@EugeneSuleimanov
@EugeneSuleimanov 2 жыл бұрын
Спасибо за отзыв! С микросервисами ещё нет, к сожалению.
@rasZam
@rasZam 3 жыл бұрын
Правильно ли будет сохранять jwt в БД?
@just_a_simple_man
@just_a_simple_man 3 жыл бұрын
А зачем мы используем Liquibase ченджсеты, если при запуске приложения хибернейт и так создает все необходимые таблицы под сущности?
@EugeneSuleimanov
@EugeneSuleimanov 3 жыл бұрын
Доверять хибернейту генерировать структуру БД не считается хорошей практикой. Слишком много тонкостей могут быть упущены. Особенно это касается проектов со сложными связями между объектами.
@just_a_simple_man
@just_a_simple_man 3 жыл бұрын
@@EugeneSuleimanov Мы в коде использовали аннотации Спринг Даты (столбцы, связи между столбцами и т.д.), и в этом случае все нужные таблицы создались при запуске приложения. Затем мы пишем ченджСеты для Ликибейз, в которых описываем те же самые таблицы еще раз. Зачем использовать оба способа одновременно?
@АндрейСинельников-ы2м
@АндрейСинельников-ы2м 4 жыл бұрын
Подскажите пожалуйста, столкнулся с проблемой, делал реализацию jwt в спринге по полному подобию, всегда получаю 403 статус, то есть токен я получил, запихнул в headers, но получаю Access.DENIED. просто написал тоже на спринг бут и все работает, может для простого спринга нужны какие нибудь дополнительные конфиги? Буду благодарен за любой совет
@shunic
@shunic 4 жыл бұрын
Привет, тоже только что запарился с этим. Весь прикол в том, что в станлартном виде мы отсылаем "Bearer " + наш токен, а автор видео отсылает "Bearer_" + наш токен. Потому, когда ресолвится токен, система его не воспринимает
@АндрейСинельников-ы2м
@АндрейСинельников-ы2м 4 жыл бұрын
@@shunic да это самое первое что поменял) я перелопатил все) уже пятый день дебажу, лезу вглубь, чтобы выяснить из за voterы голосуют за отказ
@vladislavchernyak6072
@vladislavchernyak6072 5 жыл бұрын
Может быть подскажете, как сделать фильтрацию с динамическим количеством параметров на бэкэнде(restful).
@EugeneSuleimanov
@EugeneSuleimanov 5 жыл бұрын
Думаю, это поможет: spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/
@evgeniizavodnov3086
@evgeniizavodnov3086 4 жыл бұрын
В dto (как и в model) пихать конвертеры так себе идея. Имхо использовать org.springframework.core.convert.converter.Converter было бы правильнее. @Autowired аннотация перед конструктором в используемой версии Spring Core необязательна.
@RatijasT
@RatijasT 4 жыл бұрын
полагаться на логику какой-то внешней магии для работы с вашими бизнес-моделями? ну такое себе
@evgeniizavodnov3086
@evgeniizavodnov3086 4 жыл бұрын
@@RatijasT @@RatijasT Ну если стандартные средства springframework для вас магия, то да - 'такое себе'. Вместо чтения документации на фреймворк, можно вполне себе запилить свой конвертер с блекджеком и прочими пряниками. Да и, чего уж там, вообще свой спринг написать, мало ли какая там ещё магия попадется.
@RatijasT
@RatijasT 4 жыл бұрын
@@evgeniizavodnov3086 так говорите, как будто спринг это не магия, ну действительно
Keycloak и Spring Security
37:37
Уголок сельского джависта
Рет қаралды 13 М.
POV: Your kids ask to play the claw machine
00:20
Hungry FAM
Рет қаралды 18 МЛН
The Joker wanted to stand at the front, but unexpectedly was beaten up by Officer Rabbit
00:12
АЗАРТНИК 4 |СЕЗОН 2 Серия
31:45
Inter Production
Рет қаралды 1,1 МЛН
He bought this so I can drive too🥹😭 #tiktok #elsarca
00:22
Elsa Arca
Рет қаралды 63 МЛН
Что такое JWT и как его создать
14:32
Listen IT
Рет қаралды 48 М.
Аутентификация. Сессии и JWT
23:37
senior_zone
Рет қаралды 11 М.
JWT-аутентификация для веб-приложений - Spring Security
39:49
Уголок сельского джависта
Рет қаралды 14 М.
Евгений Борисов - Spring Patterns
56:38
TechTrain
Рет қаралды 132 М.
POV: Your kids ask to play the claw machine
00:20
Hungry FAM
Рет қаралды 18 МЛН