我想要实现的目标
使用以下政策保护Keycloak中的资源:
<form #f="ngForm" (submit)="add(f.valid)" novalidate>
<label>Name</label>
<div>
<input [(ngModel)]="name" name="name" #name="ngModel" required>
</div>
<div[hidden]="name.valid || (name.pristine && !f.submitted)">
<small class="text-danger">Please input name</small>
</div>
<button type="submit">Save</button>
</form>
通过他们的官方documents和mailing list responses,似乎基于属性的访问控制是可能的,但是,我找不到让它工作的方法。
我尝试了什么
到目前为止,我已经设法在两种方法中都没有。说实话,我对授权服务中使用的术语感到不知所措。
问题 如何在keycloak中定义策略时使用资源实例的属性?
答案 0 :(得分:2)
我通过创建JavaScript策略在Keycloak 4.3中解决了此问题,因为属性策略尚不存在。这是我正在工作的代码示例(请注意,属性值是一个列表,因此您必须与列表中的第一项进行比较):
var permission = $evaluation.getPermission();
var resource = permission.getResource();
var attributes = resource.getAttributes();
if (attributes.status !== null && attributes.status[0] == "draft") {
$evaluation.grant();
} else {
$evaluation.deny();
}
答案 1 :(得分:1)
目前没有办法做你想做的事。 ResourceRepresentation类只有(id,name,uri,type,iconUri,owner)字段。因此,您可以使用所有者来确定每个Keycloak示例的所有权。我已经看过一个讨论添加额外资源属性的帖子,但还没有看到Keycloak JIRA。
也许您可以通过在运行时设置所需内容并围绕它编写策略来以某种方式使用上下文属性。
var context = $evaluation.getContext();
var attributes = context.getAttributes();
var fooValue = attributes.getValue("fooAttribute");
if (fooValue.equals("something"))
{
$evaluation.grant();
}