Spring Cloud Gateway для улучшения токенов JWT с внешнего сервера авторизации OAuth - PullRequest
0 голосов
/ 26 октября 2019

У меня есть следующие Службы защиты с помощью 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 распознал маршрут и каким-то образом улучшил токен. Возможно ли это?

Может кто-нибудь порекомендовать, как лучше это сделать?

...