Этот проект демонстрирует интеграцию микросервисов с безопасностью на основе OAuth2 и JWT.
Система реализует банковский перевод между счетами, включая:
- аутентификацию пользователя через Keycloak (Authorization Code Flow);
- проброс пользовательского JWT через API Gateway (Token Relay);
- проверку прав пользователя и сервисов на основе ролей realm_access;
- вызовы между микросервисами через Client Credentials Flow;
- разделение ответственности между UI, Gateway, transfer-service и accounts-service.
Ниже представлена последовательность взаимодействия всех компонентов системы.
sequenceDiagram
autonumber
participant User as Пользователь
participant UI as UI<br>(Spring MVC)
participant KC as Keycloak
participant GW as Gateway API<br>(Spring Cloud Gateway)
participant TR as transfer-service
participant AC as accounts-service
User ->> UI: Открывает страницу перевода<br>вводит данные
UI ->> KC: Перенаправление на авторизацию<br>(Authorization Code Flow)
KC ->> UI: user-token (JWT)
UI ->> GW: Запрос /api/transfers<br>с user-token
GW ->> GW: Проверка JWT<br>Token Relay
GW ->> TR: Проброс user-token
TR ->> TR: Проверка ролей<br>USER + transfer.write
TR ->> AC: Запрос проверки владельца<br>c service-token<br>(Client Credentials Flow)
AC ->> AC: Проверка ролей<br>SERVICE + accounts.write
AC ->> TR: Ответ о владельце
TR ->> AC: Запрос перевода<br>c service-token
AC ->> TR: Успешный результат
TR ->> UI: Ответ об успешном переводе
UI ->> User: Показ результата
- Аутентифицирует пользователя через Keycloak.
- Получает user-token (JWT).
- Делает запросы к Gateway с пользовательским токеном.
- Показывает страницу перевода и результат операции.
- Проверяет JWT как Resource Server.
- Выполняет кастомный Token Relay.
- Проксирует запросы в transfer-service.
- Принимает запросы с user-token.
- Проверяет роли пользователя (
USER,transfer.write). - Для вызова accounts-service получает service-token (Client Credentials Flow).
- Проверяет владельца счёта и выполняет перевод.
- Принимает запросы с service-token.
- Проверяет роли (
SERVICE,accounts.write). - Сообщает, кому принадлежит счёт.
- Выполняет перевод.
- Управляет пользователями, ролями и клиентами.
- Выдаёт JWT для UI и сервисов.
В проекте есть экспорт realm’а:
Он включает:
- realm
bank-realm; - пользователей;
- роли (
USER,TRANSFER_WRITE,ACCOUNTS_WRITE); - клиентов (
bank-ui,transfer-service); - протокольные мапперы.
Создавать realm, роли, пользователей или клиентов вручную НЕ нужно. При запуске контейнера Keycloak автоматически применяет этот экспорт, и вы сразу получаете полностью готовый к работе Keycloak без ручной настройки.
docker compose upKeycloak поднимется на:
http://localhost:8080
./gradlew :bank-gateway:bootRun./gradlew :accounts-service:bootRun./gradlew :transfer-service:bootRun./gradlew :bank-ui:bootRunUI будет доступен по адресу:
http://localhost:8084
- Открыть UI:
http://localhost:8084 - Перейти на страницу перевода.
- Нажать «Перейти к переводу денег».
- Авторизоваться в Keycloak (Пользователь test-user, пароль test123).
- Ввести параметры:
- Счёт отправителя:
ACC-001 - Счёт получателя:
ACC-002 - Сумма:
100
- Счёт отправителя:
- Нажать «Перевести».
- UI отправляет запрос в Gateway с пользовательским JWT.
- Gateway проверяет токен и выполняет Token Relay.
- transfer-service проверяет роли.
- transfer-service получает сервисный токен.
- transfer-service вызывает accounts-service.
- UI получает успешный ответ и показывает результат.
- На UI отображается: «Перевод выполнен...»