TL; DR
- Цель: управление разрешениями API:
- Поток прямого предоставления авторизации OIDC
- Федерация пользователей иИсточник аутентификации: LDAP
- Хранилище разрешений: устаревшая база данных
- Управление клиентами и аутентификация: Keycloak
- Вопрос: Каковы лучшие практики дляуправление правами пользователей в Keycloak и rest api?
Context
Мы реализуем API отдыха с пружиной, которая будет использоватьсямобильное приложение и SPA.Аккаунты наших пользователей, разрешения, правила ... и все данные хранятся в пользовательской базе данных, используемой различными монолитными приложениями.Для защиты нашего API мы решили использовать Keycloak.
Сервер Keycloak настроен с существующим LDAP для федерации пользователей и «Прямым потоком» для мобильного клиентского приложения.Для первого варианта использования (аутентификация) все работает нормально.
Теперь мы должны управлять разрешениями пользователей следующим образом:
Клиентские приложения должны знать разрешения пользователей на отображение/ скрыть функции
API должен иметь возможность проверять права пользователей для использования различных конечных точек
Права пользователей основаны на некоторых правилах в базе данныхи часто меняются
В моем понимании keycloak может обрабатывать авторизацию и детализированные разрешения, используя жестко заданные или пользовательские политики, но не может быть подключен к другому источнику авторизации.Как следствие, я подумал о создании настраиваемого сопоставителя ролей с использованием Keycloak SPI , получения пользовательских разрешений из настраиваемого API, который я разработаю, и сопоставления их с маркером доступа.
КакВ результате мой токен доступа должен выглядеть следующим образом:
"resource_access": {
“My-client”: {
“permissions”: [
“Show-products”,
“Buy-something”,
“Display-prices”
]
}
},
"username": “myUser”
Тогда мобильное приложение должно иметь возможность знать пользовательские разрешения на основе токена, а моя серверная часть без сохранения состояния (API) должна иметь доступ к пользовательским разрешениям накаждый вызов, чтобы проверить их с помощью весенней аннотации:
@PreAuthorize("hasRole('Show-products')")
Проблема
После первого эксперимента мое решение, кажется, работает нормально, но у меня все еще есть некоторые проблемы безопасности по этому поводувыбор, поскольку он не соответствует стандарту keycloak и включает в себя вызовы rest для другого бэкенда в средствах отображения keycloak.
Поэтому мне было интересно:
- Безопасно ли устанавливать права доступа пользователей для доступа?утверждения токена?
- Как обезопасить доступ к внешней клавиатуре (остальные вызовы) для получения разрешений?
- Следует ли мне полагаться на утверждения токенов для проверки прав доступа пользователей к каждому запросу на моем сервере ресурсов?
- Существуют ли какие-либо другие чистые решения / передовые практики для обработки разрешений пользователей из внешнего источника в keycloak?
Дополнительная информация
Я использую:
- Springboot 1.5.13.RELEASE
- Keycloak-adapter-bom 3.4.3.Final
- Автономный сервер Keycloak 3.4.3.Final