2

我正在尝试为我的 API 设置基于密钥斗篷的 ABAC、基于属性的访问控制。我能够将其设置为创建一个基于 javascript 的策略,该策略查找特定的用户属性然后授予访问权限,例如

var context = $evaluation.getContext();
var identity = context.getIdentity();
var attributes = identity.getAttributes();
var privileges = attributes.containsValue('userAttributeFlag','Y');
if (privileges) {
    $evaluation.grant();
}else{
    $evaluation.deny();
}

这只有在属性userAttributeFlag添加为客户端的用户属性映射器时才有可能,以便在访问令牌中添加相同的内容

在此处输入图像描述

我的问题是,是否总是需要在访问令牌中添加属性才能使 ABAC javascript 策略起作用。将它添加到令牌的问题是,如果我们有很多属性会不必要地增加我们希望避免的令牌大小。

在映射器中,可以选择将属性添加到 userInfo,但是否可以通过基于 javascript 的策略对其进行评估。

谢谢你的帮助。

4

1 回答 1

2

对我来说,听起来您正在使用 Keycloak 的 ABAC 来实现基于权限的 AC 或 RBAC。真正的 ABAC假定一组(相对)小的关于用户的属性一组资源属性,例如user departmentresource department。在这种情况下,您有一个基于这些属性授予或拒绝访问的策略。

例如,ALFA 策略如下所示:

namespace example{
   policy example{
      apply firstApplicable
      rule allowSameDepartment{
         permit
         condition user.department == doc.department
      }
   }
}

在您的情况下,您的代码似乎正在检查。这迫使您创建更多用户属性以实现粒度。这会导致令牌膨胀。这是所有基于令牌/基于身份的授权方案共有的问题。SAML 也是如此。JWT 确实如此。

于 2018-02-06T09:54:44.303 回答