gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:35:08 24 4
gpt4 key购买 nike

我正在使用 Zuul 反向代理实用程序配置 Spring Cloud (Angel.SR6) 应用程序,以隐藏内部服务端口。我的 zuul(边缘)服务发布在 8765 端口,我的组织服务发布在 8083 端口。当我在没有安全性的情况下访问应用程序时,一切都很顺利,http://localhost:8765/organization/organizations返回包含所有组织的 JSON。

但是,现在我想集成 Keycloak SSO (OAuth2) 服务器以进行授权。我添加了 Spring Security adapter在我的组织服务中并将其配置为在 http://localhost:8080/auth 中进行身份验证.一切都很顺利,除了 zuul 执行重定向而不是代理。所以当认证成功时,我被重定向到 http://localhost:8083/organizations而不是 http://localhost:8765/organization/organizations .这是我的浏览器请求:

enter image description here

这是因为 keycloak 适配器在 http://localhost:8083/sso/login 中创建了一个 token 验证端点。 ,从中它执行重定向到授权服务器以验证 token 。当授权服务器确认它时,重定向被发送到组织服务,带有 /organization路径,所以加载的最终 url 是 http://localhost:8083/organizations .但我希望加载第一个请求的 url。

我有哪些选择?

最佳答案

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

  • 添加到 Zuul 中的 application.properties

    zuul.sensitive-headers=Cookie,Set-Cookie
  • 在 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();
    }

    }
  • 关于spring-security - 带有 Keycloak 服务器的 Zuul 反向代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37329232/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com