У меня есть следующие Службы защиты с помощью Spring Cloud Gateway , работающие с Keycloak. Более подробно об этом я расскажу на многих серверах ресурсов Webflux.
Однако области, предоставляемые внешними серверами авторизации, очень просты. Поэтому мне нужно взять идентификатор микросервиса и идентификатор пользователя из JWT, а затем проверить базу данных, которая затем преобразуется в их команду, которая затем предоставит список доступных статических страниц и конечных точек REST URL. Таким образом, мой результирующий код хотел бы что-то вроде:
...
.matcher("/page1.html").hasAuthority("SERVICE1_PAGE1")
.matcher("/page2.html").hasAuthority("SERVICE1_PAGE2")
@PreXXX("hasAuthority('SERVICE1_getAll'))
public List<String> getAll() {...}
Я предполагаю, что я мог бы сделать это на уровне микро-услуг с помощью Извлечение полномочий вручную , но при этом мне нужно было быпродублируйте этот код в каждом микро-сервисе.
Редактировать: Это то, чем я сейчас занимаюсь, используя WebClient
для вызова другого общего микросервиса, который возвращает исправленные права доступа. Тем не менее, если URL-адрес авторизованного микросервиса является адресом шлюза, он никогда не пытается разрешить URL-адрес. Если я использую это явный URL, я получаю 401 от авторитетного микросервиса, хотя я использую ServerBearerExchangeFilterFunction
. Если я поставлю permitAll()
на микросервис, который возвращает полномочия, он будет работать.
Я мог бы поднять свой собственный сервер авторизации и использовать TokenEnhancer
. Однако при этом я предполагаю, что мне нужно будет загрузить все возможные разрешения для пользователя для каждого возможного микросервиса (поскольку я не знаю в данный момент, куда пользователь направляется) и может привести к большому количеству данных. .
В идеале я хотел бы централизовать это в шлюзе, чтобы фильтр TokenRelay
распознал маршрут и каким-то образом улучшил токен. Возможно ли это?
Может кто-нибудь порекомендовать, как лучше это сделать?