目的:我想根据传递给 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(使用前将#替换为@)