Обратный прокси Zuul с сервером Keycloak

Я настраиваю приложение Spring Cloud (Angel.SR6) с помощью утилиты обратного прокси Zuul, чтобы скрыть внутренние служебные порты. Моя служба zuul (edge) опубликована в порту 8765, а служба моих организаций - в порту 8083. Все идет гладко, когда я обращаюсь к приложению без защиты, http://localhost:8765/organization/organizations возвращает JSON со всеми организациями.

Однако теперь я хочу интегрировать сервер Keycloak SSO (OAuth2) для авторизации. Я добавил адаптер Spring Security в сервисе моей организации и настроил его для аутентификации в http://localhost:8080/auth. Все идет хорошо, за исключением того, что zuul выполняет перенаправление вместо проксирования. Поэтому, когда аутентификация прошла успешно, меня перенаправляют на http://localhost:8083/organizations вместо http://localhost:8765/organization/organizations. Вот мои запросы браузера:

введите описание изображения здесь

Это потому, что адаптер keycloak создает конечную точку проверки токена в http://localhost:8083/sso/login, из которой он выполняет перенаправление на сервер авторизации для проверки токена. Когда сервер авторизации подтверждает это, в службу организации отправляется перенаправление с путем /organization, поэтому загружаемый конечный URL-адрес равен http://localhost:8083/organizations. Но я бы хотел, чтобы вместо этого загружался первый запрошенный URL.

Какой у меня выбор?


person Xtreme Biker    schedule 19.05.2016    source источник
comment
Одно я могу сказать с уверенностью: zuul сам по себе не перенаправляет, он только пересылает ответы, поэтому, если нисходящая служба отправляет перенаправление, zuul перенаправит его в браузер.   -  person spencergibb    schedule 20.05.2016
comment
@spencergibb, я знаю, на самом деле проблема заключается в нисходящей службе, у которой настроена конечная точка входа в систему, которая перенаправляет на сервер SSO. Сервер SSO получает URL-адрес для перенаправления в качестве параметра URL-адреса, например /auth/realm/master?redirectUri=http://localhost:8083/sso/login. Таким образом, сервер SSO выполняет перенаправление на этот URL-адрес, который также перенаправляет на последний http://localhost:8083/organizations путь. Решением было бы защитить только службу zuul, поэтому я бы перенаправлял каждый запрос на сам zuul, но для этого нужно было бы оставить остальные службы открытыми.   -  person Xtreme Biker    schedule 21.05.2016


Ответы (2)


Недавно у меня была такая же проблема. Я решил это:

  1. Добавить в application.properties в Зууле

    zuul.sensitive-headers = Cookie, Установить-Cookie

  2. Ввести KeycloakFilterRoute в Зууле

    class KeycloakFilterRoute extends ZuulFilter {
    
    private static final String AUTHORIZATION_HEADER = "authorization";
    
    @Override
    public String filterType() {
        return "route";
    }
    
    @Override
    public int filterOrder() {
        return 0;
    }
    
    @Override
    public boolean shouldFilter() {
        return true;
    }
    
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        if (ctx.getRequest().getHeader(AUTHORIZATION_HEADER) == null) {
            addKeycloakTokenToHeader(ctx);
        }
        return null;
    }
    
    private void addKeycloakTokenToHeader(RequestContext ctx) {
        RefreshableKeycloakSecurityContext securityContext = getRefreshableKeycloakSecurityContext(ctx);
        if (securityContext != null) {
            ctx.addZuulRequestHeader(AUTHORIZATION_HEADER, buildBearerToken(securityContext));
        }
    }
    
    private RefreshableKeycloakSecurityContext getRefreshableKeycloakSecurityContext(RequestContext ctx) {
        if (ctx.getRequest().getUserPrincipal() instanceof KeycloakAuthenticationToken) {
            KeycloakAuthenticationToken token = (KeycloakAuthenticationToken) ctx.getRequest().getUserPrincipal();
            return (RefreshableKeycloakSecurityContext) token.getCredentials();
        }
        return null;
    }
    
    private String buildBearerToken(RefreshableKeycloakSecurityContext securityContext) {
        return "Bearer " + securityContext.getTokenString();
    }
    

    }

person andi    schedule 08.06.2016

(Переход от комментария к ответу)

В итоге я создал проект Github, чтобы объяснить свою проблему команда keycloak и получила запрос на перенос от одного из членов команды разработчиков, который пытался мне помочь. Следуя их рекомендациям, я пришел к выводу, что zuul хорошо скрывает сервисы без сохранения состояния (только носители), но не те, с которыми пользователь напрямую взаимодействует. Вот вся ветка в списке рассылки. .

person Xtreme Biker    schedule 09.03.2020