认证与权限安全
你当前正在浏览历史版本 Vert.x 5.0.12 的文档。 访问本页面的 最新版本。

ABAC 基于属性的访问控制授权提供者 (vertx-auth-abac)

该组件提供了一个基于属性访问控制(Attribute-Based Access Control, ABAC)的 AuthorizationProvider 实现。 该提供者基于策略(Policy)对象运作,策略中定义了对当前用户的属性匹配规则;当规则匹配成功时,策略所列出的权限集合将自动授予该用户。

一旦提供者为用户计算并返回了授权集合,后续的权限断言机制与其它标准 AuthorizationProvider 完全一致。

要在项目中使用该组件,请在构建描述文件中添加以下依赖:

  • Maven(在 pom.xml 中):

<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-auth-abac</artifactId>
  <version>5.0.12</version>
</dependency>
  • Gradle(在 build.gradle 文件中):

compile 'io.vertx:vertx-auth-abac:5.0.12'

创建提供者实例首先需要定义 Policy 策略对象。

例如:

{
  "name" : "仅完成多因素认证(MFA)的用户拥有 DELETE 权限",
  "attributes" : {
    "/principal/amr": {
      "eq": "mfa"
    }
  },
  "authorizations" : [ {
    "type" : "wildcard",
    "permission" : "web:DELETE"
  } ]
}

定义策略后,按如下方式创建 PolicyBasedAuthorizationProvider 实例并注册策略:

Policy policy = new Policy(
  new JsonObject()
    .put("name", "仅完成多因素认证(MFA)的用户拥有 DELETE 权限")
    .put("attributes", new JsonObject()
      .put("/principal/amr", "mfa"))
    .put("authorizations", new JsonArray()
      .add(new JsonObject()
        .put("type", "wildcard")
        .put("permission", "web:DELETE"))));

PolicyBasedAuthorizationProvider.create()
    .addPolicy(policy);

你可以从文件加载策略,也可以通过代码动态创建,并支持向提供者注册多个策略。当注册了多个策略时,所有策略均会针对该用户进行匹配评估,所有匹配成功的权限都会聚合返回。

策略核心基于属性(Attributes)进行判定。Vert.x 默认提供了用于判断相等(Equality)、否定(Negation)或集合包含(Value in Collection)的简单属性实现。这并不是限制,你完全可以通过组合模式实现自定义属性判定,并将其注册到策略中:

Attribute.create(user -> {
  // 获取当前请求来源主机
  return "localhost".equals(user.get("origin"));
});