当前位置: 首页 > 知识库问答 >
问题:

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

宗政坚白
2023-03-14

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

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

谢谢,

标记

共有1个答案

谷梁昊空
2023-03-14

我知道我晚了2年多,但我想我会分享我所知道的,希望能为未来的读者减轻一些痛苦。完全透明--我绝不是一个KeyCloak/OAuth/OIDC专家,我所知道的主要是从阅读文档、书籍、优秀的OL'YouTube和玩这个工具中获得的。

该员额将由两部分组成:

  1. 我将尽力回答您的所有问题
  2. 我将向您展示如何在不需要部署单独应用程序的情况下使用Keycloak中的策略/作用域/权限,以便更好地理解本文中的一些核心概念。但请注意,这主要是为了让你们都开始。我使用的是KeyCloak 8.0.0.
    null

最佳实践是只创建一个“视图”范围,并跨多个资源(帐户、事务等)使用它吗?还是应该创建“ViewAccount”作用域、“ViewTransaction”作用域等?

作用域表示受保护资源上的一组权限。在您的示例中,您有两个资源:accounttransaction,所以我倾向于使用第二种方法。

从长远来看,具有与所有资源关联的全局视图作用域(例如帐户事务客户结算...)使授权难以管理和适应安全需求的变化。

  • 松弛API
  • 方框API
  • 条带

但是请注意--我并不是说您不应该在资源之间共享作用域。事实上,KeyCloak允许对具有相同类型的资源进行这种操作。例如,您可能需要viewaccountviewtransaction作用域来读取给定帐户下的事务(毕竟,您可能需要访问该帐户才能查看事务)。您的要求和标准将严重影响您的设计。

对于资源和范围的每一个实际组合,通常的做法是创建一个权限吗?

    null

你如何去设置这一切完全取决于你。例如,您可以:

>

  • 定义单个策略,并将每个策略绑定在适当的权限下。

    更好的方法是定义单个策略,然后将所有相关策略分组到聚合策略(策略的策略)下,然后将该聚合策略与基于作用域的权限关联。您可以将scoped-based权限应用于资源及其所有关联的作用域。

    如果有多个权限匹配给定的资源/范围,那么Keycloak做什么?

    这取决于

    1. 资源服务器的决策策略
    2. 每个权限的决策策略
    3. 每个策略的逻辑值。
    • 权限一决策策略设置为肯定。它还有3个策略,每个策略的评估值为:
      • false
      • false

      由于其中一个策略被设置为true,所以权限一被设置为true(肯定--只有1需要为true)。

      • false
        null

      我们会继续重温这个。我将在第二部分中解释如何设置资源服务器决策策略

      例如,我可以有访问“帐户”的权限和“查看”范围的权限,所以我有查看帐户的权限?

      简短的回答是肯定的。现在,让我们进一步展开:)

        null
        null

      如果你有这个

      1. 资源服务器的决策策略设置为肯定
      2. 访问帐户/{id}资源的权限为
      3. 访问视图范围的权限为false

      您还将被授予查看该帐户的权限。

        null

      差不多吧。有很多方法可以设置这个。例如,您可以:

      1. 创建您的资源(例如/account/{id}),并将其与account:view作用域关联。
      2. 创建基于角色的策略,并在该策略下添加helpdesk角色
      3. 创建一个基于作用域的权限,称为viewaccount,并将其与作用域资源策略
      4. 绑定

      我们将在第二部分设置类似的内容。

        null
      • bank_telleraccount_owner可以访问/account/{id}资源
      • account_owner有权访问帐户:查看作用域
      • 用户无权访问资源或作用域

      请原谅我,这个例子不现实,但我不熟悉银行业:)

      cd tmp
      wget https://downloads.jboss.org/keycloak/8.0.0/keycloak-8.0.0.zip 
      unzip keycloak-8.0.0.zip
      cd keycloak-8.0.0/bin
      ./standalone.sh 
      
      1. 转到http://localhost:8080/auth
      2. 单击管理控制台链接
      3. 创建管理用户并登录
        null
      1. 单击左侧的users链接
      2. 单击添加用户按钮
      3. 输入用户名(例如bob)
      4. 确保打开User Enabled
      5. 单击保存

      请参见创建新用户

      1. 单击角色链接
      2. 单击添加角色
      3. 添加以下角色:bank_telleraccount_owneruser

      同样,不要将用户与角色关联。为了我们的目的,这是不需要的。

      参见角色

      • 单击客户端链接
      • 单击创建
      • 客户端ID
      • 输入 bank-api
      • 对于根URL,输入http://127.0.0.1:8080/bank-api
      • 单击保存
      • 确保客户端协议openid-connect
      • 访问类型更改为机密
      • 上将 授权启用更改为
      • 向下滚动并单击save。一个新的Authorization选项卡应该出现在顶部。
      • 单击授权选项卡,然后单击设置
      • 确保决策策略设置为一致
        • 这是资源服务器的决策策略
          null
          null
          null

        请参见创建资源

        1. 再次在授权选项卡下,单击策略
        2. 创建策略下拉菜单
        3. 中选择 角色
        4. 名称部分中,键入仅限银行出纳员和帐户所有者策略
        5. 领域角色下,选择bank_telleraccount_owner角色
        6. 确保逻辑设置为
        7. 单击保存
        8. 单击策略链接
        9. 再次从Create Policy下拉菜单中选择Role
        10. 这次对名称
        11. 使用 仅限帐户所有者策略
        12. 领域角色下选择account_owner
        13. 确保逻辑设置为
        14. 单击保存
        15. 单击顶部的policy链接,您现在应该看到新创建的策略。

        参见基于角色的策略

          null
        • 再次在Authorization选项卡下,选择Evalue
        • 用户下输入bob
        • 角色下选择用户
          • 这是我们将用户与我们创建的角色关联的地方。

          参见评估和测试策略

          1. 返回权限部分
          2. Create Permission下拉菜单下选择scope-based
          3. 名称下,输入查看帐户范围权限
          4. 范围下,输入帐户:查看
          5. 应用策略下,输入仅限帐户所有者策略
          6. 确保决策策略设置为一致
          7. 单击保存
            null

          整洁:)希望这能有所帮助。

  •  类似资料:
    • 你能给我提供一个资源范围使用或建议的例子吗?

    • 我正计划使用JWT。JWT将包含权限列表,单个微服务将使用“位置”和“权限”的组合来确定。 不幸的是,我无法在Keycloak中配置客户端来分配策略和权限,也无法在Internet上找到任何示例。

    • http://${host}:${port}/auth/realms/${realm_name}/authz/protection/resource_set 但是我没有看到一个API来CRUD授权策略和权限。 我试图通过protection/resource_setendpoint创建策略,但失败了:

    • 正如在链接https://developers.DocuSign.com/esign-rest-api/guides/authentication/oauth2-code-grant中提到的,DocuSign允许获取用户数据的三个访问范围:签名、扩展和模拟。我正在寻找一个范围,允许我只读取访问。我需要建立一个仪表板的各种活动/更新(获得所有信封的状态,等等)的所有DocuSign用户在我的公司。

    • 我有以下场景:一个客户端应用程序试图访问API网关后面的APIendpoint。我想验证(使用id和秘密)应用程序,如果它是应用程序A允许它访问endpoint/信用,如果它是应用程序B允许它访问endpoint/借方。 我假设API网关应该验证一个调用是否应该被拒绝。你能告诉我我的工作流应该是什么样子,我应该使用什么Keycloak功能吗?

    • 我试图更好地理解一旦Android11版本发布,我将能够做什么。 我的应用程序使用提供的图像文件路径创建相册,但使用Android11,我将无法直接访问文件。 根据Android开发人员的文档,他们最近引入了权限,但我不明白如果添加了这个权限,我是否能够继续通过访问文件。 有人有主意吗??? 谢谢 2021年1月更新 我在一个Android11虚拟设备上试用了我的应用程序,它似乎可以完美地工作,即