Конфигурация ресурсов на основе аннотаций Keycloak

#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