基于Keycloak ABAC的策略实施器,无需在令牌中添加属性

时间:2018-02-05 17:46:58

标签: javascript spring-security authorization keycloak keycloak-services

我正在尝试为我的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 属性添加为客户端的用户属性映射器时才可以执行此操作,以便在访问令牌中添加相同的内容

enter image description here

我的问题是,是否始终需要在访问令牌中添加属性才能使ABAC javascript策略生效。将其添加到令牌的问题是,如果我们有很多属性会不必要地增加我们想要避免的令牌大小。

在映射器中,有一些选项可以将属性添加到userInfo,但是可以通过基于javascript的策略来评估该属性。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

例如,ALFA政策看起来像:

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

在您的情况下,您的代码似乎正在进行检查。这会强制您创建更多用户属性以实现粒度。这导致令人沮丧。这是所有基于令牌的/基于身份的授权方案都很常见的问题。 SAML也是如此。 JWT也是如此。