文档权限
> 文档中心 > 文档中心 > INFINI Easysearch > 功能手册 > 安全模块 > 权限控制 > 文档权限

文档级权限 #

文档级权限允许您将角色限制为索引中文档的一部分子集。

参考设置 #

文档级权限使用 Easysearch 查询 DSL 来定义角色授予对哪些文档的访问权限。

{
  "bool": {
    "must": {
      "match": {
        "public": "true"
      }
    }
  }
}

上面的查询指定了该角色访问的文档里面,其字段 public 必须匹配 true

指定字段 query 并设置为将上面的查询,并对查询字符串进行转义,最后的角色设置如下:

PUT _security/role/public_data
{
  "cluster": [
    "*"
  ],
  "indices": [{
    "names": [
      "pub*"
    ],
    "query": "{\"term\": { \"public\": true}}",
    "privileges": [
      "read"
    ]
  }]
}

上面的查询也可以根据需要写的很复杂,但是我们建议保持简单,以最大程度地减少文档级安全功能对集群的性能影响。

参数替换 #

查询过程中可以利用上下文变量,可根据当前用户的属性来强制实施规则替换。例如 ${user.name} 将替换为当前用户的名称。

如下规则允许用户读取字段 readable_by 为其用户名值的任何文档:

PUT _security/role/user_data
{
  "cluster": [
    "*"
  ],
  "indices": [{
    "names": [
      "pub*"
    ],
    "query": "{\"term\": { \"readable_by\": \"${user.name}\"}}",
    "privileges": [
      "read"
    ]
  }]
}

支持以下变量:

名称描述
${user.name}用户名.
${user.roles}用户的角色列表,使用逗号分割。
${attr.<TYPE>.<NAME>}用户的自定义属性, <TYPE> 支持 internalldap

基于属性的权限控制 #

可以将角色和参数替换与 terms_set 查询一起使用,以启用基于属性的权限控制。

定义角色 #

PUT _security/role/abac
{
  "indices": [{
    "names": [
      "*"
    ],
    "query": "{\"terms_set\": {\"security_attributes\": {\"terms\": [${attr.internal.permissions}], \"minimum_should_match_script\": {\"source\": \"doc['security_attributes'].length\"}}}}",
    "privileges": [
      "read"
    ]
  }]
}

定义用户 #

PUT _security/user/user1
{
  "password": "asdf",
  "roles": ["abac"],
  "attributes": {
    "permissions": "\"att1\", \"att2\", \"att3\""
  }
}

定义文档 #

POST easysearch/_doc/1
{
  "security_attributes":"att1"
}

注意,索引的 security_attributes 必须是 keyword 类型。