keycloak中的资源,范围,权限和策略

时间:2017-02-12 10:37:35

标签: permissions keycloak

我想使用Keycloak的授权系统创建一个相当简单的基于角色的访问控制系统。系统Keycloak正在替换允许我们创建一个“用户”,他是一个或多个“组”的成员。在这个遗留系统中,用户被授予“权限”,可以通过组成员资格(其中组被分配权限)或直接授予用户权限来访问大约250个“能力”中的每一个。

我想将遗留系统映射到keycloak授权。

我应该很容易将现有系统中的每个“功能”映射到一个keycloak资源和一组keycloak范围。例如,“viewAccount”功能显然会映射到“帐户”资源和“视图”范围;并且“viewTransaction”映射到“事务”资源......但最佳做法是创建一个“视图”范围,并在多个资源(帐户,事务等)中使用它?或者我应该创建“viewAccount”范围,“viewTransaction”范围等?

同样,我对权限有点困惑。对于资源和范围的每个实际组合,通常的做法是创建权限吗?如果有多个权限匹配给定的资源/范围,Keycloak会做什么?我猜测Keycloak的意图是允许我配置针对资源和范围的权限矩阵,所以例如我可以获得访问“帐户”的权限和“查看”范围的权限,因此我有权限查看帐户?

我问,因为所有这些的结果似乎是我的旧“viewAccount”功能最终创建了一个“帐户”资源,具有“查看”范围和“viewAccount”权限,这似乎让我回到了哪里我曾是。如果这是正确的,那很好。

最后,显然我需要一组确定是否应该应用viewAccount的策略。但我是对的,这意味着我需要一个用户可能属于的每个遗留组的策略吗?例如,如果我有“帮助台”角色,那么我需要一个“帮助台会员”政策,然后我可以将其添加到“viewAccount”权限中。这是对的吗?

谢谢,

标记

3 个答案:

答案 0 :(得分:5)

我希望通过纯HTTP方法强制执行授权,而不使用适配器,因为Lua没有适配器。希望这个答案能帮助人们寻找基于非适配器的方法。

如果您正在寻找适配器,那么quick start guide是最好的起点。尤其是spring boot authz example

对于基于纯HTTP的实现:

步骤1:

Keycloak Admin UI

中定义策略和权限

第2步

具有一个内部映射,其中包含哪些HTTP路径属于哪些资源以及每个路径所需的作用域。也可以将其保存在configuration file中。当调用特定路由时,请调用Keycloak令牌终结点以验证访问令牌的声明。

{
  "policy-enforcer": {
    "user-managed-access" : {},
    "enforcement-mode" : "ENFORCING"
    "paths": [
      {
        "path" : "/someUri/*",
        "methods" : [
          {
            "method": "GET",
            "scopes" : ["urn:app.com:scopes:view"]
          },
          {
            "method": "POST",
            "scopes" : ["urn:app.com:scopes:create"]
          }
        ]
      }
    ]
  }
}

如果您使用的是适配器,但未指定路径或资源,则适配器将在内部搜索路径和资源from Keycloak

第3步:

使用令牌端点来get or evaluate权限。您可以使用response_mode参数获取最终决定(是否提供访问权限)或检索整个权限。

curl -X POST \
  http://${host}:${port}/auth/realms/${realm}/protocol/openid-connect/token \
  -H "Authorization: Bearer ${access_token}" \
  --data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
  --data "permission=Resource A#Scope A"

如果授权请求未映射到任何权限,则将返回403 HTTP状态代码。

答案 1 :(得分:4)

我知道我参加聚会有点晚了,但让我尽可能多地解释一下。

在keycloak中,我们有这样的术语:

资源:用户将访问或执行操作的对象

Auth scopes :用户可以对特定对象执行的操作

政策:政策

权限:映射实际发生在这里

如果您不想遵循手动方式,您可以导出此 JSON 并且所有用户、资源、权限都将自动设置 bu keycloak

JSON configuration file

现在让我们看一个场景:

enter image description here

现在我们的资源很少,例如:

  1. 帐户
  2. 机器人
  3. 报告

我们希望实现只有特定用户才能执行特定操作的场景。

设置 Keycloak

创建新领域

  1. 点击添加领域按钮。

enter image description here

  1. 输入 test-v1 作为名称。
  2. 点击创建。

enter image description here

创建新角色

  1. 点击角色
  2. 点击添加角色
  3. 创建角色“admin”、“agent”和“super_admin”

enter image description here

创建客户端

  • 点击客户标签
  • 在客户端 ID 文本框中输入 app-client
  • 点击保存
  • 再次选择客户端以配置其他设置
  • 验证客户端协议为 openid-connect
  • 将访问类型设置为机密
  • 将授权启用设置为开启
  • 最后点击保存按钮。
  • 顶部会出现一个新的授权标签。
  • 选择“授权”选项卡,然后选择“设置”

检查决策策略是否设置为一致。这是资源服务器策略

enter image description here

创建自定义身份验证范围

转到授权标签 选择授权范围 >并点击创建 在文本中输入 scopes:createscopes:view 并保存值。

enter image description here

创建资源

  • 立即转到资源标签>并点击创建
  • 一一输入并创建以下资源res:account & res:bot & res:report
  • 对于范围文本中的所有资源,请选择我们早期创建的范围 scopes:createscopes:view
  • 点击保存

enter image description here

创建政策

  • 再次在“授权”标签中,选择政策
  • 点击创建政策下拉菜单并选择角色
  • 在名称文本框中,管理员
  • 在 Realm Roles 中选择角色 Admin
  • 检查逻辑设置为正
  • 单击“保存”,对“代理”和“超级管理员”执行相同操作

enter image description here

  • 再次在“授权”标签中,选择政策
  • 点击创建政策下拉菜单并选择聚合
  • 在名称文本框中,Admin 或 Super_admin 或 Agent
  • 在 Realm Roles 中选择角色 Admin & Super_admin & Agent
  • 检查逻辑设置为肯定
  • 点击保存 enter image description here

创建权限

  • 再次在“授权”选项卡中,选择权限
  • 点击创建权限下拉菜单并选择基于范围
  • 在名称文本框中,account-create
  • 在资源框中,选择“资源资源:帐户”
  • 在范围选择中,范围:创建
  • 应用政策管理员
  • 我们必须按照要求为所有资源设置相同的权限enter image description here

创建用户

  • 在用户选项卡内创建一个 test 用户 我们不会为其分配任何角色、范围或组以进行测试

让我们评估

  • 再次在“授权”选项卡中,选择评估
  • 选择我们创建的客户端,app-client
  • 在用户中选择创建的用户,测试
  • 在角色中选择创建的用户,admin
  • 资源价值,res:account
  • 点击添加按钮
  • 点击评估按钮

enter image description here

您将看到授权被允许,因为管理员角色有权对资源进行创建查看操作帐户

让我们再次评估

  • 再次在“授权”选项卡中,选择评估
  • 选择我们创建的客户端,app-client
  • 在用户中选择创建的用户,测试
  • 在角色中选择创建的用户,admin
  • 资源价值,res:report
  • 范围值,范围:创建
  • 点击添加按钮
  • 点击评估按钮

enter image description here

您将看到授权为拒绝,因为只有 Super_Admin 角色有权对资源报告进行操作创建 .

答案 2 :(得分:0)

可以在此处找到具有资源、范围和权限的有效解决方案 keycloak-nodejs-example

使用 docker-compose 使用 Quick Start guide 运行已经配置好的 Keycloak。

项目中其他有用的例子

  • 不使用 Keycloak 登录页面的自定义登录。
  • 不使用会话的无状态 Node.js 服务器。 Keycloak 令牌使用 cookie 存储。
  • 用于检查权限的集中式中间件。未明确描述的路由无法访问。
  • 没有 keycloak.json 的配置。它可用于为多个环境进行配置。例如——DEV、QA。
  • 使用 Keycloak REST API 创建用户、角色和自定义属性的示例。