Рубрики
Без рубрики

Аутентификация JWT в Spring Security и Angular

В этом сообщении в блоге объясняется веб-токен JSON (JWT) аутентификация с использованием Spring Security, Spring Boot,… Помечен как java, spring security, angular, springboot.

В этом сообщении в блоге объясняется аутентификация веб-токена JSON (JWT) с использованием Spring Security, Spring Boot, Spring Data и Angular. Исходный код, загруженный в репозиторий Github

Изображение с помощью Мастер-микс из Pixabay

JSON Web Токен (JWT) – это открытый стандарт ( RFC 7519 ), который определяет компактный и автономный способ безопасной передачи информации между сторонами в виде объекта JSON. Эта информация может быть проверена и ей можно доверять, поскольку она имеет цифровую подпись. JWTS могут быть подписаны с использованием секрета (с помощью алгоритма HMAC ) или пары открытых/закрытых ключей с использованием RSA или ECDSA .

В своей компактной форме веб-токены JSON состоят из трех частей, разделенных точками ( . ), которые являются:

  • Заголовок
  • Полезная нагрузка
  • Подпись

Таким образом, JWT обычно выглядит следующим образом.

Таким образом, JWT обычно выглядит следующим образом.

Заголовок

Заголовок обычно состоит из двух частей: типа токена, которым является JWT, и используемого алгоритма подписи, такого как HMAC SHA256 или RSA.

Например:

{  
  "alg": "HS256",  
  "typ": "JWT"  
}

Тогда этот JSON будет Base64Url закодирован для формирования первой части JWT.

Полезная нагрузка

Вторая часть токена – это полезная нагрузка, которая содержит утверждения. Утверждения – это утверждения о сущности (как правило, пользователе) и дополнительных данных. Существует три типа претензий: зарегистрированные , публичные и частные претензии.

Подпись

Чтобы создать часть подписи, вы должны взять закодированный заголовок, закодированную полезную нагрузку, секрет, алгоритм, указанный в заголовке, и подписать это. Пожалуйста, прочтите https://jwt.io/introduction/ для подробного рабочего процесса и описания

  1. Пружинный ботинок 2.2.x
  2. Пружинная защита
  3. Spring Data JPA
  4. Библиотека Java JWT
  5. Встроенная база данных H2

Существует множество реализаций JWT с открытым исходным кодом, доступных для всех языков . В этом сообщении в блоге мы используем библиотеку Java jwt в этом сообщении в блоге.

В этом сообщении в блоге мы используем библиотеку Java || jwt || в этом сообщении в блоге.

  1. Создайте пустой проект spring boot с помощью spring boot, зависимостей безопасности и добавьте зависимости, как показано выше
  2. Создать UserController класс, который принимает параметры имени пользователя и пароля и проверяет подлинность пользователей через UsernamePasswordAuthenticationToken класс
@PostMapping(value = {**"/authenticate"**,**"/login"**})  
**public** Object loginUser(@RequestParam String username, @RequestParam String password)  
{  
   Authentication authentication=**authenticationManager**.authenticate( **new** UsernamePasswordAuthenticationToken(username, password));  

**return** mapUserAndReturnJwtToken(authentication,**true**);  
}

4. Создайте класс SecurityConfig (показан ниже), который определяет стандартную конфигурацию безопасности Spring для проекта.

5. Метод public void configure(HttpSecurity http) разрешает все запросы на URL-адреса входа в систему, поскольку аутентификация выполняется вручную через in UserController класс

UserController || класс

6. Класс JwtUtil отвечает за выдачу и проверку токенов. В частности, метод createToken() создает токен с 24-часовым сроком действия и подписывается с помощью пользовательского ключа из свойств файл (убедитесь, что он длинный и его трудно угадать)

файл (убедитесь, что он длинный и его трудно угадать)

7. Метод validateToken() проверяет предоставленный токен путем проверки даты истечения срока действия

8. Создайте Фильтр запросов Jwt фильтр, который перехватывает все запросы от клиента и ищет токен на предъявителя . Если токен присутствует, извлеките имя пользователя и подтвердите дату истечения срока действия.

9. Если токен действителен, создайте новый UsernamePasswordAuthenticationToken и установить Пользовательские данные и userdetailsservice органы власти. Сохраните это как объект проверки подлинности Spring Security, который сообщает spring security, что этот пользователь прошел проверку подлинности, и продолжайте работу с цепочкой безопасности.

10. Чтобы этот фильтр работал, в Security Config добавьте его перед Фильтр аутентификации имени пользователя и пароля

http.addFilterBefore(**jwtRequestFilter**,UsernamePasswordAuthenticationFilter.**class**);

11. Чтобы продемонстрировать демонстрацию, сгенерированный проект Angular с 2 страницами. Логин и домашняя страница

  1. Этот проект использует базу данных в памяти H2 в качестве базы данных. И schema.sql файл в каталоге src/main/resources создает необходимые таблицы, а data.sql файл вставляет примеры пользователей и ролей
  2. Запустите класс spring boot Jwt Spring Security Application для запуска приложения
  3. Теперь перейдите к http://localhost:8080/h2-console чтобы просмотреть базу данных и ввести учетные данные (показано ниже)

h2 в базе данных памяти

4. Проверьте существующих пользователей с помощью запроса ВЫБЕРИТЕ * ИЗ CORE_USER. Если вы не видите никаких результатов, скопируйте инструкции SQL из data.sql в src/main/resources и выполнить его

5. Теперь перейдите в каталог src/webapp и установите все зависимости

$ npm install

6. Запустите приложение Angular с помощью следующей команды

$ npm run start --watch

7. Теперь перейдите к http://localhost:4200 и вы будете перенаправлены на страницу входа в систему

8. Введите учетные данные admin/admin и вы будете перенаправлены на главную страницу.

9. На домашней странице во время начальной загрузки мы используем токен с предыдущей страницы (сохраненный в виде файла cookie) и получаем информацию о пользователе, предоставляя этот токен приложению spring boot (просто чтобы убедиться, что токен действителен)

9. Смотрите вкладку сеть для получения токена JWT с датой истечения срока действия

Домашняя страница

Код загружен в Github для справки, счастливого кодирования:)

Оригинал: “https://dev.to/pavankjadda/jwt-authentication-in-spring-security-and-angular-2ehk”