【问题标题】:How to implement group-membership JavaScript policy in Keycloak如何在 Keycloak 中实现组成员 JavaScript 策略
【发布时间】:2019-02-09 12:17:14
【问题描述】:

2-year old keycloak-user list question 没有答案:

  1. 有一个名为 Project 的受保护资源
  2. 和所有者 - 项目经理
  3. 每个项目经理只能访问自己的项目(仅限所有者政策)。
  4. 项目经理依次向一名或多名项目组合经理报告。投资组合经理应该能够访问他/她的所有项目经理的项目(投资组合经理政策)。

让我们假设系统设计是否灵活,以及谁是特定项目经理的投资组合经理这一事实 可以保存在 Keycloak 中(但不能保存为 keycloak groups)或客户端应用程序本身。如何在 Keycloak 中将其实现为 JavaScrtipt-based authorization policy?我想请求可以以某种方式注入此信息,但无法从文档中弄清楚。

【问题讨论】:

    标签: javascript keycloak


    【解决方案1】:

    事实证明这很容易。我决定将有关经理的信息保存在另一个数据库中,然后应用程序 (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 客户端必须机密才能调用令牌端点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 2018-04-19
      • 2013-05-17
      • 1970-01-01
      • 2013-12-25
      • 2016-08-07
      相关资源
      最近更新 更多