#elasticsearch #elasticsearch-x-pack
#elasticsearch #elasticsearch-x-pack
Вопрос:
Я использую ES 6.2.4 и использую X-Pack. Я регистрирую пользователя со следующими ролями:
{
"password" : "changeme",
"roles" : [ "object_basic", "object_ext" ],
"full_name" : "FullName",
"email" : "sample@example.com",
"metadata" : {
"access_group_ids": ["1", "2", "3"]
}
}
У меня есть следующие роли безопасности.
Object_basic:
{
"indices": [
{
"names": [ "*cases_*" ],
"privileges": [ "read" ],
"field_security" : {
"grant" : [ "case_id","short_name", "type", "status", "owner_department" ]
},
"query": "{"template":{"source":"{\"bool\":{\"should\":[{\"terms\":{\"case_access_owner_group_ids\": {{#toJson}}_user.metadata.access_group_ids{{/toJson}}}},{\"terms\":{\"case_access_contributor_group_ids\": {{#toJson}}_user.metadata.access_group_ids{{/toJson}} }},{\"terms\":{\"case_access_viewer_group_ids\": {{#toJson}}_user.metadata.access_group_ids{{/toJson}} }},{\"terms\":{\"case_access_basic_viewer_group_ids\": {{#toJson}}_user.metadata.access_group_ids{{/toJson}} }} ]}}"}}"
}
]
}
Object_ext:
{
"indices": [
{
"names": [ "*cases_*" ],
"privileges": [ "read" ],
"field_security" : {
"grant" : [ "name", "description" ]
},
"query": "{"template":{"source":"{\"bool\":{\"should\":[{\"terms\":{\"case_access_owner_group_ids\":{{#toJson}}_user.metadata.access_group_ids{{/toJson}}}},{\"terms\":{\"case_access_contributor_group_ids\":{{#toJson}}_user.metadata.access_group_ids{{/toJson}}}},{\"terms\":{\"case_access_viewer_group_ids\": {{#toJson}}_user.metadata.access_group_ids{{/toJson}}}}]}}"}}"
}
]
}
Единственное различие между двумя запросами роли безопасности заключается в том, что object_ext содержит на один (ы) критерий (ы) меньше (т.е.: case_access_basic_viewer_group_ids ).
Я проглотил некоторые данные, содержащие значения, подобные следующим:
"case_access_owner_group_ids": [],
"case_access_contributor_group_ids": [],
"case_access_viewer_group_ids": [],
"case_access_basic_viewer_group_ids": ["2"],
Когда я назначаю обе роли (object_basic и object_ext) пользователю, возвращаются все поля (включая «имя», «описание»).
Это не то, чего я ожидал. Я ожидал бы, что «имя», «описание» НЕ возвращаются, поскольку только case_access_basic_viewer_group_ids НЕ включен в запрос object_ext.
Теперь, если я обновлю роли пользователя и оставлю только object_ext, он будет вести себя правильно и ничего не вернет.
Если я обновляю роли пользователя и оставляю только object_basic, то он не возвращает «имя», «описание».
Я, конечно, хочу, чтобы пользователю были назначены обе роли, и возвращать «имя», «описание» только тогда, когда соответствующие массивы содержат действительные данные в сочетании с массивом метаданных пользователя. Теперь похоже, что если запускается роль obj_basic, она также автоматически запускает obj_ext.
Что я делаю не так?
Ответ №1:
Похоже, что (по крайней мере) для версии 6.2.4 невозможно обеспечить безопасность на уровне документа и поля с тем же индексом, который задокументирован здесь .
Если вам нужно ограничить доступ как к документам, так и к полям, рассмотрите возможность разделения документов по индексу.
Это может быть реальной проблемой при определенных условиях, поскольку это может привести к принудительной нормализации модели.