Keycloak 自定义声明:您可以在查询外部数据库时在运行时添加参数吗

2024-01-24

目的:我想根据传递给 keycloak 自定义实现的某些字段获取自定义声明,该字段位于应用程序内部,不存在于 keycloak 中。我正在努力在春季将遗留应用程序迁移到 keycloak 进行身份验证,但我们希望继续使用现有应用程序的授权。现有授权基于ABAC,严重依赖动态资源。

Look at this https://stackoverflow.com/a/63311019/3534593创建自定义映射器和声明的解决方案。我可以在步骤 # 5 之前传递一些变量,以便根据基于变量的信息获取自定义声明吗?我还没有尝试实现它,但假设这将由 Keycloak 在内部调用(我已经实现了用户存储 SPI,所以我假设是这样)。

Eg:

用户具有到resource_1的映射,这取决于用户所属的项目(应用程序内部并且不存储在keycloak中)。 因此,根据用户及其project_id,我想调用外部数据库并获取到资源的映射。

挑战:

如何以及在哪里传递project_id?我无法将其存储在 keycloak 中 因为它是动态的而不是静态的。有可能吗?

再如,

我想在我的情况的声明中放入一些值,这些值只能通过 HTTP 请求传输,如下所示,但在 Java 自定义映射器实现中,

http://localhost:8080/auth/realms/tsp_openapi/login-actions/authenticate?session_code=_N7IcTaPF3vTtkPtIKQweKyCQRaXyVu2JF-fgcWQd40&execution=8975a242-0d40-4a47-992c-6ea7dd91728e&client_id=pplantoo&tab_id=fXCfFj3BG2c&**project_id=2232123321**

根据我们在评论中的讨论以及我在Keycloak文档 https://www.keycloak.org/docs/9.0/authorization_services/,您可以在客户端应用程序上设置 Keycloak 适配器,使其也充当策略执行器点(又名)。 PEP 通过更新您的keycloak.json具有这样的属性

"policy-enforcer": {
    "paths": [
      {
        "path": "/protected/resource",
        "claim-information-point": {
          "claims": {
            "project_id_claim": "{request.parameter['project_id']}"
          }
        }
      }
    ]
}

通过这样做,Keycloak适配器将向Keycloak授权服务器发送请求以及project_id_claim查看是否允许当前用户(拥有当前令牌)访问请求的 URL。 我想你也许可以添加自定义策略(例如使用基于 JavaScript 的策略 https://www.keycloak.org/docs/latest/authorization_services/#_policy_js)来查询您的数据库或后端服务,以查看具有提供的project_id的给定用户是否获得授权。如果这不起作用,我想您应该尝试实现自定义“PolicyProvider”接口并使用该接口。但是我不确定它如何/是否会出现在用户界面中。

我应该提到的是,我以前从未尝试过这一点,这些都是基于我对 Keycloak 类似的事情是如何完成的以及阅读他们的文档的经验。

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

Keycloak 自定义声明:您可以在查询外部数据库时在运行时添加参数吗 的相关文章

随机推荐

  • 如何在一个 ggplot 中绘制 S&P 500 和苏富比时间序列?

    我正在使用 quantmod 包下载 S P 500 时间序列和苏富比股票 library zoo library tseries library quantmod library ggplot2 env1 new env getSymbo
  • VBox 共享文件夹中符号链接的 Windows 问题

    我在 Virtual Box 上有一个 Ubuntu 17 虚拟机 我的主机操作系统是 windows 8 1 我在主机和来宾操作系统之间创建了一个共享文件夹 现在 因为windows不支持symlinks https en wikiped
  • 优化 SQL 查询

    我目前正在开发一个内容管理系统 我想听听您对以下方面的想法 我有一张桌子 page 我们假设它看起来像这样 ID Title Content 1 Test This is a test 除此之外 我还有一个page option表 这样我可
  • 如何使用 Reflection.Emit 创建多维数组

    我想使用 Reflection Emit 创建一个多维数组并设置它的元素 就像下面的C 代码 int nums new int 2 2 nums 1 1 2 并转成IL代码 IL 0000 nop IL 0001 ldc i4 2 IL 0
  • 在 Android 设备上使用 CCV

    有人尝试过在 Android 上使用 libccv 吗 我在网上找不到任何示例代码 想知道如何使用 CCV 在 Android 应用程序中实现跟踪器 这包括执行以下操作 处理来自 Android 设备相机的图像 在设备屏幕上显示经过CCV处
  • WPF TextBlock 在多行上显示字符串

    我有一个字符串 Item A r nItem B r nItem C 如何将此字符串绑定到 TextBlock 以便它显示为 Item A Item B Item C Thanks 只需使TextBlock大到足以显示三行 TextBloc
  • C#-R 接口

    我需要将 R 连接到某些 C 应用程序 我安装了rscproxy 1 3 and R Scilab DCOM3 0 1B5添加了 COM 引用STATCONNECTORCLNTLib StatConnectorCommonLib and S
  • jQuery:如何触发悬停?

    如何触发第二个悬停功能 adm1n toolbar hover function function adm1n toolbar content select change function e adm1n toolbar trigger m
  • 使用这个关键字来继承? [复制]

    这个问题在这里已经有答案了 可能的重复 scala 自我类型和特征子类有什么区别 https stackoverflow com questions 1990948 what is the difference between scala
  • 无法从日期列进行测量

    我正在尝试计算 completionDate 列中的日期与今天之间的天数 表名称为 事件 2 我有一个名为 事件 的模拟器表 它正在工作 代码 DaysClosed DATEDIFF Incidents 2 completionDate D
  • 在 matplotlib 中绘制 pandas 日期

    我有一个包含日期的固定宽度数据文件 但是当我尝试绘制数据时 日期未在 x 轴上正确显示 我的文件看起来像 2014 07 10 11 49 14 377102 45 2014 07 10 11 50 14 449150 45 2014 07
  • 当复选框控件的 Visible 变为 true 时 comctl32.dll 使用过多内存

    我在 C NET 应用程序运行时向 Windows 窗体添加控件 这些控件中的每一个都与特定信号交互 并使用该信号中的一些数据 信号名称 描述 来源 单位 值等 这些控件上有一个复选框 当其中一个信号的复选框的 Visible 属性变为 t
  • 使用 ggplot2 中的 geom_area() 为雷达图中的区域着色

    在继续阅读之前 我建议您下载并查看原始代码这个问题发布在这个论坛 https stackoverflow com questions 50353923 generate radar charts with ggplot2 noredirec
  • 是否可以明确识别 DML 命令是否是从存储过程发出的?

    我继承了一个 SQL Server 2008 数据库 调用应用程序可以通过存储过程访问该数据库 数据库中的每个表都有一个影子审计表 其中记录了插入 更新 删除操作 填充审计表的性能测试表明 使用插入审计记录OUTPUT子句比使用触发器快 2
  • 如何在 Xamarin.Forms 中根据 ListView 滚动方向显示和隐藏 StackLayout?

    我有一个屏幕ListView显示评论集合 另外 我有一个StackLayout与末端重叠ListView 其中有一个Entry and a Button添加新评论 我想隐藏 显示这个StackLayout取决于ListView滚动方向 如果
  • ftp_put():无法打开该文件:没有这样的文件或目录

    我在互联网上搜索了很多 但没有找到解决方案 我需要通过 PHP 将文件上传到 FTP 服务器 我测试了各种 PHP 脚本 如下所示 但我总是收到相同的问题 我尝试使用绝对路径 正常路径和其他路径 连接的警告 ftp put 无法打开该文件
  • 如何在 Flutter 中使用 Razorpay Orders API?

    我正在我的 flutter 应用程序中实现支付网关 所以 Razorpay 推荐我使用 Orders API 但我没有任何方法来实现 Orders API 我参考了以下文档 它包含 java PHP 等的示例 但没有找到 Flutter D
  • 错误:pnpm monorepo 工作空间内的子模块 git init 后,“请求 url * 超出 Vite 服务允许列表”

    我已经设置了一个 pnpm 工作区 其中包含许多我添加为 git 子模块的项目 之前工作的 Nuxt 项目突然开始出现错误The request url is outside of Vite serving allow list对于多个文件
  • 在postgresql中,分区还是多个数据库更有效?

    有一个应用程序 许多公司在其中发布信息 每个公司的数据都是独立的 没有数据重叠 从性能角度来看 最好是 在每个表的每一行上保留公司 ID 并让每个索引都使用它 根据公司ID对每个表进行分区 分区并创建一个用户来访问每个公司以确保安全 创建多
  • Keycloak 自定义声明:您可以在查询外部数据库时在运行时添加参数吗

    目的 我想根据传递给 keycloak 自定义实现的某些字段获取自定义声明 该字段位于应用程序内部 不存在于 keycloak 中 我正在努力在春季将遗留应用程序迁移到 keycloak 进行身份验证 但我们希望继续使用现有应用程序的授权