Zuul 反向代理与 Keycloak 服务器

2024-01-26

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

但是,现在我想集成 Keycloak SSO (OAuth2) 服务器以进行授权。我已经添加了Spring 安全适配器 https://keycloak.github.io/docs/userguide/keycloak-server/html/ch08.html#spring-security-adapter在我的组织服务中并将其配置为在中进行身份验证http://localhost:8080/auth。一切都很顺利,除了 zuul 执行的是重定向而不是代理。因此,当身份验证成功时,我会被重定向到http://localhost:8083/organizations代替http://localhost:8765/organization/organizations。这是我的浏览器请求:

这是因为 keycloak 适配器在http://localhost:8083/sso/login,它执行重定向到授权服务器以验证令牌。当授权服务器确认后,重定向将发送到组织服务,其中包含/organization路径,因此加载的最终网址是http://localhost:8083/organizations。但我希望加载第一个请求的网址。

我有什么选择?


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

  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();
    }
    

    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Zuul 反向代理与 Keycloak 服务器 的相关文章

随机推荐

  • Microsoft Graph API:访问控制允许来源

    我正在尝试集成 Microsoft Graph 身份验证和访问共享点以及用户的图形配置文件和图片 我遵循了他们的文件https developer microsoft com en us graph docs authorization a
  • Qt3D默认制服和属性

    我开始学习通过 QML 使用着色器 但找不到任何讨论传递给着色器的默认统一和属性值的参考资料 在某些示例中 我们可以看到其中的几个 例如顶点位置 or 模型视图投影 这也被传递为mvp 但是没有包含我们可以使用的所有变量的清晰列表 在调查
  • 跨区域小数/双精度解析

    事实上 我有多个可以生成数字数据的系统 它们以文本文件的形式存储在某些网络服务器上 有些系统使用小数点作为分数分隔符 有些系统也使用小数点逗号 应用程序 胖客户端 net 2 0 也可以在任一类型的系统上运行 因此 经过一番绊倒后 我这样做
  • Count 总是返回 1...但是它存在吗?

    我试图在创建文件名之前检查特定类别的 评论 列中是否已存在文件名 如果它已经存在 我想将今天的日期添加到名称中以使其成为唯一的文件名 我似乎无法使用计数来查找它是否存在 当我 echo checkfile 时 无论文件存在与否 它总是返回
  • 三角矩阵系数索引号的算法

    我认为这一定很简单 但我无法正确理解 我有一个 MxM 三角矩阵 其系数逐行存储在向量中 例如 M m00 m01 m02 m03 m11 m12 m13 m22 m23 m33 存储为 coef m00 m01 m02 m03 m11 m
  • 为什么 Mathematica 会打破模块中正常的作用域规则?

    正如最近的一篇文章中指出的post https stackoverflow com questions 2733239 lexical and dynamic scoping in mathematica local variables w
  • 在 Angular 4 模板中显示地图内容

    我正在尝试在我的模板中显示地图 myMap Map
  • Azure 上的静态类和多个实例

    我正在构建一个将部署在 Azure 上的应用程序 如果我使用静态类 所有实例是否都可以访问相同的静态对象 或者每个实例在生成每个实例时都会实例化自己的静态对象 static每个 AppDomain 字段都有一个值 它们显然不会在计算机之间共
  • 如何在 spmd 块中索引共分布式数组

    我正在做一个非常大的计算 大气吸收 其中有很多单独的窄峰 最后全部加起来 对于每个峰 我预先计算了峰形函数值高于我选择的阈值的范围 然后我逐行将峰添加到我的光谱中 下面给出了一个最小示例 X 1 1e7 K numel a count th
  • Javascript对函数数组执行“reduce”如何实现函数组合?

    我在中遇到了这种模式redux compose功能 我仍然不明白在下面的示例中如何从最后一个而不是从第一个开始评估函数 function f2 a return a a function f3 a return a a a function
  • 如何修复 sapper/svelte 中的 localStorage 错误

    import writable from svelte store Read the current token from LocalStorage on boot const token writable localStorage get
  • 如何让 Windows Phone 应用程序像默认应用程序一样加载得更快?

    我发现 Windows 手机中的默认应用程序 如 People Calculator etc 根本不需要时间加载 他们甚至没有启动屏幕图像 我尝试从应用程序的项目中排除 SplashScreenImage jpg 并在手机上运行它 我的应用
  • squeel 中的嵌套查询

    简短版本 如何在 squeel 中编写此查询 SELECT OneTable my count FROM OneTable JOIN SELECT DISTINCT one id count AS my count FROM Another
  • Git Bash 安装 React-Scripts 时出现错误“UNKNOWN:未知错误,scandir 'E:\...\node_modules\@babel\.helper-annotate-as-pure.DELETE'”

    UNKNOWN unknown error scandir E Sorted Capstone WOO WOO net WOO WOO net project FrontEnd frontendapp node modules babel
  • JSON.stringify 缺少属性

    我正在编写一个自定义 console error 函数 以便每次发生错误时我都会收到一封电子邮件 要在电子邮件正文中发送错误 我使用JSON stringify 问题是它缺少一些属性 请参阅下面的两张图片 Email In console
  • 在MVC中使用Json.NET自动将mongodb ObjectId重新设置为字符串

    我有一个 MVC net 项目 并且正在使用 mongodb 在我的一些控制器中 我返回带有 ObjectId 的 JsonResult 我希望将 ObjectId 序列化为字符串 我发现了类似的问题并使用了这个答案 使用自定义JsonCo
  • 选择具有最小计数的行 (*)

    假设我有一个带有列的简单投票表 id primaryKey token int candidate int rank int 我想提取具有特定排名的所有行 按候选人分组 最重要的是仅使用最小计数 到目前为止我已经达到了 SELECT can
  • 自动布局(约束)与自动调整大小蒙版(弹簧和支柱)

    这些布局系统可帮助您调整大小 无论屏幕大小和方向如何 如果我有自动调整大小掩模 弹簧和支柱 这样的简单解决方案 为什么我应该使用自动布局 约束 当我开始使用自动布局时我也有同样的问题 自动布局可以做到这一切弹簧和支柱为我们提供以及更多 自动
  • 数据模板有多贵? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 I have 性能问题 https stackoverflow com q 38248842 1997232我正在努力挖掘原因 到目前为止 我不
  • Zuul 反向代理与 Keycloak 服务器

    我正在使用 Zuul 反向代理实用程序配置 Spring Cloud Angel SR6 应用程序 以隐藏内部服务端口 我的 zuul 边缘 服务发布在 8765 端口 我的组织服务发布在 8083 端口 当我在没有安全性的情况下访问应用程