如何在 Keycloak 中实现组成员 JavaScript 策略
How to implement group-membership JavaScript policy in Keycloak
一个2-year old keycloak-user list questionw/o一个答案:
- 有一个名为 Project
的受保护资源
- 和所有者 - 项目经理
- 每个项目经理只能访问自己的项目(仅限所有者政策)。
- 项目经理依次向一位或多位投资组合经理汇报工作。投资组合经理应该能够访问所有 his/her 项目经理的项目(投资组合经理策略)。
让我们假设系统设计是否灵活,以及谁是特定项目经理的项目组合经理
可以保存在 Keycloak 中(但不能作为 keycloak groups)或客户端应用程序本身。如何将其实现为基于 JavaScrtipt 的
Keycloak 中的授权策略?我想请求可以以某种方式注入此信息,但无法从文档中找到它。
事实证明这很容易。我决定将有关经理的信息保存在另一个数据库中,然后应用程序 (service-nodejs
) 需要将此信息作为声明传递给 keycloak。我已经在 service-nodejs keycloak quickstart 上测试过了。以下是相关部分:
// app.js route:
app.get('/service/project/:id',
keycloak.enforcer(['Project'], {
response_mode: 'permissions',
claims: (request) => {
return { "portfolio.managers": ['alice', 'bob'] } //hard-coded
}
}), function(req, res) {
res.json({ message: `got project "operation "` });
});
保护项目资源的策略是 OwnerOnly 和 PortfolioManagers 的集合:
// portfolio-managers-policy:
var context = $evaluation.getContext();
var identity = context.getIdentity();
var userid = identity.getAttributes().getValue('preferred_username').asString(0);
var managers = context.getAttributes().getValue('portfolio.managers')
if (!managers) {
print('managers not provided, cannot decide!');
$evaluation.deny();
} else {
// check if the user is one of the portfolio managers of this project:
for (var i = 0; i < managers.size(); i++) {
if (managers.asString(i) == userid) {
$evaluation.grant();
break;
}
}
}
请注意,service-nodejs
keycloak 客户端必须 机密 才能调用令牌端点。
一个2-year old keycloak-user list questionw/o一个答案:
- 有一个名为 Project 的受保护资源
- 和所有者 - 项目经理
- 每个项目经理只能访问自己的项目(仅限所有者政策)。
- 项目经理依次向一位或多位投资组合经理汇报工作。投资组合经理应该能够访问所有 his/her 项目经理的项目(投资组合经理策略)。
让我们假设系统设计是否灵活,以及谁是特定项目经理的项目组合经理 可以保存在 Keycloak 中(但不能作为 keycloak groups)或客户端应用程序本身。如何将其实现为基于 JavaScrtipt 的 Keycloak 中的授权策略?我想请求可以以某种方式注入此信息,但无法从文档中找到它。
事实证明这很容易。我决定将有关经理的信息保存在另一个数据库中,然后应用程序 (service-nodejs
) 需要将此信息作为声明传递给 keycloak。我已经在 service-nodejs keycloak quickstart 上测试过了。以下是相关部分:
// app.js route:
app.get('/service/project/:id',
keycloak.enforcer(['Project'], {
response_mode: 'permissions',
claims: (request) => {
return { "portfolio.managers": ['alice', 'bob'] } //hard-coded
}
}), function(req, res) {
res.json({ message: `got project "operation "` });
});
保护项目资源的策略是 OwnerOnly 和 PortfolioManagers 的集合:
// portfolio-managers-policy:
var context = $evaluation.getContext();
var identity = context.getIdentity();
var userid = identity.getAttributes().getValue('preferred_username').asString(0);
var managers = context.getAttributes().getValue('portfolio.managers')
if (!managers) {
print('managers not provided, cannot decide!');
$evaluation.deny();
} else {
// check if the user is one of the portfolio managers of this project:
for (var i = 0; i < managers.size(); i++) {
if (managers.asString(i) == userid) {
$evaluation.grant();
break;
}
}
}
请注意,service-nodejs
keycloak 客户端必须 机密 才能调用令牌端点。