Doc*_*val 43 permissions keycloak
我想使用Keycloak的授权系统创建一个相当简单的基于角色的访问控制系统.系统Keycloak正在替换允许我们创建一个"用户",他是一个或多个"组"的成员.在该遗留系统中,通过组成员资格(其中组被分配了权限)或直接向用户授予许可,给予用户"许可"以访问大约250个"能力"中的每一个.
我想将遗留系统映射到keycloak授权.
我应该很容易将现有系统中的每个"功能"映射到一个keycloak资源和一组keycloak范围.例如,"viewAccount"功能显然会映射到"帐户"资源和"视图"范围; 并且"viewTransaction"映射到"事务"资源......但最佳做法是创建一个"视图"范围,并在多个资源(帐户,事务等)中使用它?或者我应该创建"viewAccount"范围,"viewTransaction"范围等?
同样,我对权限有点困惑.对于资源和范围的每个实际组合,通常的做法是创建权限吗?如果有多个权限与给定的资源/范围匹配,Keycloak会做什么?我猜测Keycloak的意图是允许我配置针对资源和范围的权限矩阵,所以例如我可以获得访问"帐户"的权限和"查看"范围的权限,因此我有权限查看帐户?
我问,因为所有这些的结果似乎是我的旧"viewAccount"功能最终创建了一个"帐户"资源,具有"查看"范围和"viewAccount"权限,这似乎让我回到原来的位置.哪个好,如果是正确的.
最后,显然我需要一组策略来确定是否应该应用viewAccount.但我是对的,这意味着我需要一个用户可能属于的每个遗留组的策略吗?例如,如果我有"帮助台"角色,那么我需要一个"帮助台会员"政策,然后我可以将其添加到"viewAccount"权限中.它是否正确?
谢谢,
标记
我希望通过纯 HTTP 方法强制执行授权,而不使用适配器,因为 Lua 没有适配器。希望这个答案可以帮助人们寻找基于非适配器的方法。
如果您正在寻找适配器,快速入门指南是最好的起点。尤其是spring boot authz 示例。
对于纯基于 HTTP 的实现:
第1步:
在Keycloak Admin UI 中定义策略和权限
第2步
具有哪些 HTTP 路径属于哪些资源以及每个路径所需的范围的内部映射。这也可以保存在配置文件中。当调用特定路由时,调用 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"]
}
]
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是适配器并且未指定路径或资源,则适配器将在内部从 Keycloak搜索路径和资源。
第 3 步:
使用令牌端点来获取或评估权限。您可以使用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"
Run Code Online (Sandbox Code Playgroud)
如果授权请求未映射到任何权限,403则返回 HTTP 状态代码。
我知道我迟到了2年多,但我想我会分享我所知道的东西,并希望减轻以后读者的痛苦。完全透明-我绝不是Keycloak / OAuth / OIDC专家,我所了解的主要是阅读文档,书籍,出色的YouTube以及使用该工具。
这篇文章将由两部分组成:
Keycloak 8.0.0。开始之前的一些术语:
Resource-Based获得权限,您可以将其直接应用于资源Scoped-Based获得许可,您可以将其应用于您的范围或范围和资源。最佳实践是仅创建一个“视图”范围,并在多种资源(帐户,交易等)中使用它吗?还是应该创建“ viewAccount”范围,“ viewTransaction”范围等?
范围代表受保护资源的一组权限。在您的情况下,您有2个资源:account和transaction,所以我倾向于第二种方法。
从长远来看,有一个全球性的view与所有的资源相关的范围内(例如account,transaction,customer,settlement...)作出授权很难既管理和适应安全需求的变化。
以下是一些示例,您可以查看这些示例以获得设计感
不过请注意-我并不是说您不应该跨资源共享范围。实际上,Keycloak对于资源具有相同的用途type。你可以例如既需要viewAccount和viewTransaction范围,以给定的帐户下的读取一个事务(毕竟,你可能需要访问帐户查看交易)。您的要求和标准将严重影响您的设计。
对于资源和范围的每种实用组合,是否通常创建许可?
不好意思,我不太了解这个问题,因此我会比较宽泛。为了授予/拒绝访问resource,您需要:
以便政策执行生效。请参阅授权过程。
如何设置所有这些完全取决于您。例如,您可以:
定义单个策略,并在适当的权限下绑定每个策略。
更好的是,定义单个策略,然后将所有相关策略归为一个aggregated策略(一个策略策略),然后将该聚合策略与scope-based权限相关联。您可以将该scoped-based许可权应用于资源及其所有关联范围。
或者,您可以通过利用两种不同的类型进一步分解权限。您可以通过resource-based权限类型专门为您的资源创建权限,并通过权限类型单独将其他权限与范围单独关联scope-based。
您有选择。
如果有多个权限匹配给定的资源/范围,Keycloak会做什么?
这取决于
Decision StrategyDecision StrategyLogic价值。该Logic值与Java的!运算符相似。可以是Positive或Negative。如果Logic为Positive,则该策略的最终评估保持不变。如果为Negative,则否定的最终结果(例如,如果策略评估为false,Logic则为Negative,则它将为true)。为简单起见,我们假设Logic始终设置为Positive。
这Decision Strategy是我们真正要解决的问题。在Decision Strategy可以是Unanimous或Affirmative。从文档中
决策策略
此配置更改了策略评估引擎基于所有评估权限的结果来决定是否应授予资源或范围的方式。肯定是指至少一个许可必须评估一个肯定的决定,才能授予对资源及其范围的访问权限。一致意味着所有权限都必须评估为肯定的决定,以便最终决定也为肯定的。例如,如果对同一资源或范围的两个权限发生冲突(其中一个权限授予访问权限,另一个权限拒绝访问),则在所选策略为肯定的情况下,将授予对资源或范围的权限。否则,对任何权限的一个拒绝也将拒绝对资源或范围的访问。
让我们使用一个示例来更好地理解上述内容。假设你有2级权限的资源,有人试图访问该资源(记住,Logic是Positive所有策略)。现在:
Permission One有一个Decision Strategy设置为Affirmative。它还有3个策略,它们各自对它们进行评估:
true false false 由于其中一项政策设置为true,Permission One因此设置为true(肯定-仅需要设置为1 true)。
Permission Two有一Decision Strategy组以Unanimous2种策略:
true false 在这种情况下Permission Two,false因为一个策略是错误的(一致-它们都必须是true)。
Decision Strategy设置为Affirmative,访问该资源将被授予因为Permission One是true。另一方面,如果资源服务器的Decision Strategy设置为Unanimous,则访问将被拒绝。看到:
我们将继续讨论。我将Decision Strategy 在第二部分中说明如何设置资源服务器。
因此,例如,我可以有权访问“帐户”和“查看”范围的权限,因此我将有权查看帐户?
简短的答案是肯定的。现在,让我们对此进行扩展:)
如果您具有以下情况:
Decision Strategy设置为Unanimous或Affirmative account/{id}资源的权限为true view范围的权限为true您将被授予访问该帐户的权限。
true+ true等于或true之下。 AffirmativeUnanimous Decision Strategy现在如果你有这个
Decision Strategy设置为Affirmative account/{id}资源的权限为trueview范围的权限为false 你会也被授予访问权限查看的帐户。
true+ false是true下Affirmative的策略。这里的要点是,对给定资源的访问还取决于您的设置,因此请小心,因为您可能不需要第二种情况。
但是我是对的,这意味着我需要一个用户可能属于的每个旧组的策略吗?
我不确定Keycloak在2年前的表现如何,但是您可以指定一个基于组的策略,然后直接在该策略下添加所有组。您当然不需要为每个组创建一个策略。
例如,如果我具有“服务台”角色,则需要一个“服务台成员身份”策略,然后可以将其添加到“ viewAccount”权限中。它是否正确?
差不多了 您可以通过多种方式进行设置。例如,您可以:
/account/{id}),并将其与account:view范围关联。helpdesk在该策略下添加角色Scope-Based名为的权限viewAccount,并将其与绑定在一起scope,resource然后policy我们将在第二部分中进行类似的设置。
Keycloak有一个简洁的小工具,可让您测试所有策略。更好的是,您实际上不需要启动其他应用程序服务器并部署单独的应用程序即可正常工作。
这是我们要设置的方案:
stackoverflow-demobank-api在该领域下创建一个客户/account/{id}为该客户定义一个资源account/{id}将有account:view范围bob在新领域下创建一个名为bank_teller,account_owner和user
bob与任何角色相关联。现在不需要。Role-Based策略:
bank_teller并account_owner有权访问/account/{id}资源account_owner有权使用account:view范围user 无权访问资源或范围Evaluate工具来查看如何授予或拒绝访问。请原谅我,这个例子是不现实的,但我对银行业并不熟悉:)
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
Run Code Online (Sandbox Code Playgroud)
http://localhost:8080/authAdministration Console链接 有关更多信息,请访问入门。就我们的目的而言,以上已足够。
master,然后单击Add Realm按钮。stackoverflow-demo作为名称。Create。stackoverflow-demo而不是master领域。请参阅创建新领域
Users左侧的链接Add User按钮username(例如bob)User Enabled已打开Save 请参阅创建新用户
Roles链接Add Role bank_teller,account_owner和user同样,也没有与角色的用户联系起来。对于我们的目的,这是不需要的。
查看角色
Clients链接Createbank-api的Client ID Root URL进入http://127.0.0.1:8080/bank-apiSave Client Protocol是openid-connect Access Type为confidential Authorization Enabled为OnSave。新Authorization选项卡应显示在顶部。Authorization选项卡,然后Settings Decision Strategy设置为Unanimous
Decision Strategy看到:
Authorization标签Authorization Scopes> Create弹出Add Scope页面account:view名称,然后按Enter。Authorization链接ResourcesCreate View Account Resource两者的Name和Display name account/{id}的URI account:view在Scopes文本框中输入Save请参阅创建资源
Authorization标签下,点击Policies Role从Create Policy下拉菜单中选择Name部分中,键入Only Bank Teller and Account Owner Policy Realm Roles选择bank_teller和account_owner角色Logic其设置为Positive Save Policies链接 Role从Create Policy下拉菜单中再次选择。Only Account Owner Policy用于Name Realm Roles选择下account_ownerLogic其设置为PositiveSave Policies顶部的链接,您现在应该看到新创建的策略。请参阅基于角色的策略
请注意,Keycloak具有更强大的策略。请参阅管理策略
Authorization标签下,点击PermissionsResource-Based View Account Resource Permission的Name Resources型View Account Resource Permission Apply Policy选择下Only Bank Teller and Account Owner Policy Decision Strategy设置为UnanimousSave 请参阅创建基于资源的权限
ew ...
Authorization标签下,选择Evaluate User输入bob Roles选择下user
Resources选择下View Account Resource,然后单击Add View Account Resource with scopes [account:view]以查看结果,您应该看到DENY。Only Bank Teller and Account Owner Policy。让我们测试一下以确保这是真的!Back评估结果上方的链接account_owner,然后单击Evaluate。现在,您应该看到结果为PERMIT。如果您返回并将角色更改为bank_teller 请参阅评估和测试策略
Permissions节Scope-Based在Create Permission下拉菜单中选择此时间。Name,输入View Account Scope Permission Scopes,输入account:view Apply Policy,输入Only Account Owner Policy Decision Strategy设置为UnanimousSave请参阅创建基于范围的权限
第二次试运行
Authorization节Evaluatebob bank_teller View Account Resource点击Add Evaluate,我们应该得到DENY。
bank_teller可以访问,resource但不能访问scope。在这里,一个许可权评估为true,另一个许可权评估为false。鉴于资源服务器的Decision Strategy设置为Unanimous,最后的决定是DENY。Settings下的Authorization,然后将更Decision Strategy改为Affirmative,然后再次返回到步骤1-6。这次,最终结果应该是PERMIT(一个许可为真,因此最终决定为真)。Decision Strategy重新设置为Unanimous。再次返回步骤1至6,但这一次将角色设置为account_owner。这次PERMIT,鉴于account_owner可以同时访问resource和,因此最终结果还是有意义的scope。整洁:)希望这会有所帮助。
我知道我参加聚会有点晚了,但让我尽可能多地解释一下。
在keycloak中,我们有这样的术语:
资源:用户将访问或执行操作的对象
身份验证范围:用户可以对特定对象执行的操作
政策: 政策
权限:映射实际发生在这里
如果您不想遵循手动方式,您可以导出此 JSON 并且所有用户、资源、权限都将自动设置 bu keycloak
现在让我们看一个场景:
现在我们几乎没有资源,例如:
我们想要实现只有特定用户才能执行特定操作的场景。
开创新境界
检查决策策略是否设置为Unanimous。这是资源服务器策略
转到Authorization选项卡 选择Authorization Scopes > 并单击Create在文本中 输入scopes:create & scopes:view并保存值。


您将看到授权是允许的,因为Admin角色有权在资源帐户上执行创建和查看操作。
您将看到 grant is Deny因为只有Super_Admin角色有权对资源报告执行操作创建。
| 归档时间: |
|
| 查看次数: |
5380 次 |
| 最近记录: |