带有Keycloak服务器的Zuul反向代理

Xtr*_*ica 5 spring-security spring-boot spring-cloud keycloak netflix-zuul

我正在使用Zuul反向代理实用程序配置Spring Cloud(Angel.SR6)应用程序,以便隐藏内部服务端口。我的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。

我有哪个选择?

and*_*ndi 5

最近我也遇到了同样的问题。我已经解决了:

  1. 添加到 Zuul 中的 application.properties

    zuul.sensitive-headers=Cookie,设置 Cookie

  2. Zuul中引入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();
    }
    
    Run Code Online (Sandbox Code Playgroud)

    }


Xtr*_*ica 0

(从评论迁移到答案)

我最终创建了一个Github 项目,以便向 keycloak 团队解释我的问题,并收到了一位试图帮助我解决问题的开发团队成员的拉取请求。根据他们的建议,我得出的结论是 zuul 适合隐藏无状态服务(仅承载服务),但不适合隐藏用户直接交互的服务。这是邮件列表中的整个主题。