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 Strategy
Decision Strategy
Logic
价值。该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
组以Unanimous
2种策略:
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
之下。 Affirmative
Unanimous
Decision Strategy
现在如果你有这个
Decision Strategy
设置为Affirmative
account/{id}
资源的权限为true
view
范围的权限为false
你会也被授予访问权限查看的帐户。
true
+ false
是true
下Affirmative
的策略。这里的要点是,对给定资源的访问还取决于您的设置,因此请小心,因为您可能不需要第二种情况。
但是我是对的,这意味着我需要一个用户可能属于的每个旧组的策略吗?
我不确定Keycloak在2年前的表现如何,但是您可以指定一个基于组的策略,然后直接在该策略下添加所有组。您当然不需要为每个组创建一个策略。
例如,如果我具有“服务台”角色,则需要一个“服务台成员身份”策略,然后可以将其添加到“ viewAccount”权限中。它是否正确?
差不多了 您可以通过多种方式进行设置。例如,您可以:
/account/{id}
),并将其与account:view
范围关联。helpdesk
在该策略下添加角色Scope-Based
名为的权限viewAccount
,并将其与绑定在一起scope
,resource
然后policy
我们将在第二部分中进行类似的设置。
Keycloak有一个简洁的小工具,可让您测试所有策略。更好的是,您实际上不需要启动其他应用程序服务器并部署单独的应用程序即可正常工作。
这是我们要设置的方案:
stackoverflow-demo
bank-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/auth
Administration 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
链接Create
bank-api
的Client ID
Root URL
进入http://127.0.0.1:8080/bank-api
Save
Client Protocol
是openid-connect
Access Type
为confidential
Authorization Enabled
为On
Save
。新Authorization
选项卡应显示在顶部。Authorization
选项卡,然后Settings
Decision Strategy
设置为Unanimous
Decision Strategy
看到:
Authorization
标签Authorization Scopes
> Create
弹出Add Scope
页面account:view
名称,然后按Enter。Authorization
链接Resources
Create
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_owner
Logic
其设置为Positive
Save
Policies
顶部的链接,您现在应该看到新创建的策略。请参阅基于角色的策略
请注意,Keycloak具有更强大的策略。请参阅管理策略
Authorization
标签下,点击Permissions
Resource-Based
View Account Resource Permission
的Name
Resources
型View Account Resource Permission
Apply Policy
选择下Only Bank Teller and Account Owner Policy
Decision Strategy
设置为Unanimous
Save
请参阅创建基于资源的权限
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
设置为Unanimous
Save
请参阅创建基于范围的权限
第二次试运行
Authorization
节Evaluate
bob
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 次 |
最近记录: |