В этом сообщении в блоге объясняется аутентификация веб-токена 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/ для подробного рабочего процесса и описания
- Пружинный ботинок 2.2.x
- Пружинная защита
- Spring Data JPA
- Библиотека Java JWT
- Встроенная база данных H2
Существует множество реализаций JWT с открытым исходным кодом, доступных для всех языков . В этом сообщении в блоге мы используем библиотеку Java jwt в этом сообщении в блоге.
В этом сообщении в блоге мы используем библиотеку Java || jwt || в этом сообщении в блоге.
- Создайте пустой проект spring boot с помощью spring boot, зависимостей безопасности и добавьте зависимости, как показано выше
- Создать 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 страницами. Логин и домашняя страница
- Этот проект использует базу данных в памяти H2 в качестве базы данных. И
schema.sql
файл в каталоге src/main/resources создает необходимые таблицы, аdata.sql
файл вставляет примеры пользователей и ролей - Запустите класс spring boot Jwt Spring Security Application для запуска приложения
- Теперь перейдите к 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”