#java #spring-boot #microservices #keycloak
#java #весенняя загрузка #микросервисы #keycloak
Вопрос:
Недавно я работаю с микросервисами, разработанными как приложения Spring Boot (версия 2.2), и в моей компании мы используем Keycloak в качестве сервера авторизации. Мы выбрали его, потому что нам нужны сложные политики, роли и группы, а также нам нужна управляемая пользователем авторизация (UMA) для совместного использования ресурсов между пользователями.
Мы настроили Keycloak с одной областью и множеством клиентов (по одному клиенту на микросервис). Теперь я понимаю, что мне нужно явно определить ресурсы в Keycloak, и это нормально, но вопрос в следующем: действительно ли мне нужно дублировать их все в файле свойств моего микросервиса? Вся документация, примеры и учебные пособия заканчиваются одним и тем же, то есть чем-то вроде:
keycloak.policy-enforcer-config.enforcement-mode=PERMISSIVE
keycloak.policy-enforcer-config.paths[0].name=Car Resource
keycloak.policy-enforcer-config.paths[0].path=/cars/create
keycloak.policy-enforcer-config.paths[0].scopes[0]=car:create
keycloak.policy-enforcer-config.paths[1].path=/cars/{id}
keycloak.policy-enforcer-config.paths[1].methods[0].method=GET
keycloak.policy-enforcer-config.paths[1].methods[0].scopes[0]=car:view-detail
keycloak.policy-enforcer-config.paths[1].methods[1].method=DELETE
keycloak.policy-enforcer-config.paths[1].methods[1].scopes[0]=car:delete
(этот второй пример лучше подходит для нашего случая, поскольку он также использует разные области авторизации для каждого метода http).
В реальной жизни каждый разрабатываемый нами микросервис имеет десятки конечных точек, и определять их одну за другой мне кажется пустой тратой времени и недостатком надежности кода: мы меняем конечную точку, нам нужно перенастроить ее как в Keycloak, так и в свойствах приложения.
Есть ли способ использовать какую-то аннотацию на уровне контроллера? Что-то вроде следующего псевдокода:
@RestController
@RequestMapping("/foo")
public class MyController {
@GetMapping
@KeycloakPolicy(scope = "foo:view")
public ResponseEntity<String> foo() {
...
}
@PostMapping
@KeycloakPolicy(scope = "bar:create")
public ResponseEntity<String> bar() {
...
}
}
Комментарии:
1. Вы нашли какое-либо решение?
2. Да, я справился с этим, написав автоконфигуратор для keycloak, основанный на swagger api. Я опубликую черновик на github, как только смогу
Ответ №1:
В конце концов, я разработал свой собственный проект, который предоставляет возможности автоматической настройки для проекта spring-boot, который должен работать как сервер ресурсов.
Проект выпущен под лицензией MIT2 и доступен на моем github: keycloak-resource-autoconf