Данные учебный проект был выполнен в рамках курса OTUS Spring Framework Developer.
Проект представляет собой клон goodreads (ну почти). Поддержана возможность создавать работы разных авторов и добавлять к этим работам конкретные издания книг, возможно для разных языков.
Добавлен аудит изменений сущностей (в самих сущностях).
Возможность регистрации пользователей.
Реализован флоу Token Relay с помощью Spring Cloud Gateway и Spring Authorization Server. Все запросы проходят через gateway, который выступает как oauth2 клиент для сервера авторизации. Сервер авторизации генерирует jwt токены, регистрирует и логинит пользователей. При этом клиенты публичные в виде SPA и других токены не видят и не хранят. Клиенты знают только о сессиях по кукам в браузере, и из этой куки токен может быть получен в случае с уже аутентифицированным пользователем.
Сервер авторизации отвечает за аутентификацию, а gateway на основе полученных данных просто ретранслирует полученный токен к ресурсному серверу. Этот самый ресурсный сервер обязан проверить jwt токен и пустить на ресурс юзера или нет. В конфигурации с клиентом oauth на стороне security gateway невозможно настроить авторизацию НЕ на ресурсных микросервисах. Для того, что бы так сделать, надо добавить к security gateway зависимость resource server, таким образом он может уже проверять токен на авторизацию по ролям.
Для реализации авторизации по ролям необходимо на сервере авторизации
реализовать OAuth2TokenCustomizer, который будет добавлять в токен информацию о ролях юзера.
Для получения ролей из JWT токена необходимо реализовать собственный JWT конвертер на ресурсных
серверах, который уже будет доставать роли из токена и по ним осуществлять авторизацию.
В паттерне Spring Security Gateway, роль единой точки авторизации может взять на себя Spring Cloud Gateway. Spring Cloud Gateway сохраняет сессии в редисе.
- Spring Boot 3.3.0
- Spring Cloud Eureka
- Spring Security
- Role based authorization
- OAuth + JWT token + Token Relay pattern
- Spring Cloud Gateway
- Token Relay
- Spring Session Redis
- Spring Authorization Server
- Mongo DB
- Mongock migrations
- Spring Data Mongo Repositories
Обязательно надо указать явно все параметры при шифровании
Шифрование файла с голыми
паролями - mvn jasypt:encrypt -Djasypt.plugin.path="file:./src/main/resources/application.yml" -Djasypt.encryptor.password=masterpassword
Шифрование строки с помощью плагина - mvn jasypt:encrypt-value -Djasypt.encry ptor.password=masterpassword -Djasypt.encryptor.algorithm=PBEWithMD5AndDES -Djasypt.encryptor.ivGeneratorClassName=org.jasypt.iv.NoIvGenerator -Djasypt.plugin.value=mongopass
docker build -t evawe/library-backend:1 --build-arg maven_profile=no-frontend --build-arg JASYPT_PASSWORD=masterpassword .
docker run --rm --name library-backend -e JASYPT_PASSWORD=masterpassword -e MONGODB_DATABASE=library -e MONGODB_PORT=27017 -e MONGODB_HOST=localhost evawe/library-backend:1
Для сокрытия паролей и прочих интересных переменных используется файл .env из корня проекта.
Пример содержимого файла:
JASYPT_MASTER_PASSWORD=пароль MONGO_CONTAINER_PASSWORD=пароль
Zuul не работает с версиями спринг бута выше 2.2.Х
Необходимо использовать spring cloud gateway