Filtry zabezpečení pro oříznutí výsledků ve službě Azure AI Search
Azure AI Search neposkytuje nativní oprávnění na úrovni dokumentu a nemůže lišit výsledky hledání na základě identity uživatele. Jako alternativní řešení můžete vytvořit filtr, který oříznou výsledky hledání na základě řetězce obsahujícího skupinu nebo identitu uživatele.
Tento článek popisuje vzor pro filtrování zabezpečení pomocí následujících kroků:
- Sestavení zdrojových dokumentů s požadovaným obsahem
- Vytvoření pole pro hlavní identifikátory
- Nasdílení dokumentů do indexu vyhledávání pro indexování
- Dotazování indexu
search.in
pomocí funkce filtru
Končí odkazy na ukázky a příklady, které poskytují praktické učení. Doporučujeme si nejprve projít tento článek, abyste pochopili vzor.
O vzoru filtru zabezpečení
Přestože Azure AI Search neintegruje s subsystémy zabezpečení pro přístup k obsahu v indexu, mnoho zákazníků, kteří mají požadavky na zabezpečení na úrovni dokumentů, zjistí, že filtry můžou vyhovovat jejich potřebám.
Ve službě Azure AI Search je filtr zabezpečení pravidelným filtrem OData, který obsahuje nebo vyloučí výsledek hledání na základě řetězce sestávajícího z objektu zabezpečení. Prostřednictvím objektu zabezpečení není k dispozici žádné ověřování ani autorizace. Objekt zabezpečení je pouze řetězec, který se používá ve výrazu filtru k zahrnutí nebo vyloučení dokumentu z výsledků hledání.
Existuje několik způsobů, jak dosáhnout filtrování zabezpečení. Jedním ze způsobů je složitá disjunkce výrazů rovnosti: Id eq 'id1' or Id eq 'id2'
například a tak dále. Tento přístup je náchylný k chybám, obtížně se udržuje a v případech, kdy seznam obsahuje stovky nebo tisíce hodnot, zpomalí dobu odezvy dotazu o mnoho sekund.
Lepším řešením je použít search.in
funkci pro filtry zabezpečení, jak je popsáno v tomto článku. Pokud použijete search.in(Id, 'id1, id2, ...')
místo výrazu rovnosti, můžete očekávat subsekundové doby odezvy.
Požadavky
Řetězcové pole obsahující identitu skupiny nebo uživatele, například identifikátor objektu Microsoft Entra.
Další pole ve stejném dokumentu by měla obsahovat obsah, který je přístupný pro danou skupinu nebo uživatele. V následujících dokumentech JSON pole "security_id" obsahují identity používané ve filtru zabezpečení a jméno, plat a rodinný stav, pokud identita volajícího odpovídá "security_id" dokumentu.
{ "Employee-1": { "employee_id": "100-1000-10-1-10000-1", "name": "Abram", "salary": 75000, "married": true, "security_id": "alphanumeric-object-id-for-employee-1" }, "Employee-2": { "employee_id": "200-2000-20-2-20000-2", "name": "Adams", "salary": 75000, "married": true, "security_id": "alphanumeric-object-id-for-employee-2" } }
Vytvoření pole zabezpečení
V indexu vyhledávání v kolekci polí potřebujete jedno pole, které obsahuje identitu skupiny nebo uživatele, podobně jako fiktivní pole "security_id" v předchozím příkladu.
Přidejte pole zabezpečení jako
Collection(Edm.String)
.Nastavte atribut pole
filterable
natrue
hodnotu .Nastavte atribut pole
retrievable
takfalse
, aby se nevrátil jako součást požadavku hledání.Indexy vyžadují klíč dokumentu. Pole "file_id" splňuje tento požadavek.
Indexy by také měly obsahovat prohledávatelný a načístelný obsah. Pole "file_name" a "file_description" představují v tomto příkladu.
Následující schéma indexu splňuje požadavky na pole. Dokumenty, které indexujete ve službě Azure AI Search, by měly mít hodnoty pro všechna tato pole, včetně group_ids. U dokumentu s
file_name
secured_file_b mají k souboru přístup jen uživatelé, kteří patří do ID skupin "group_id1" nebo "group_id2".POST https://[search service].search.windows.net/indexes/securedfiles/docs/index?api-version=2024-07-01 { "name": "securedfiles", "fields": [ {"name": "file_id", "type": "Edm.String", "key": true, "searchable": false }, {"name": "file_name", "type": "Edm.String", "searchable": true }, {"name": "file_description", "type": "Edm.String", "searchable": true }, {"name": "group_ids", "type": "Collection(Edm.String)", "filterable": true, "retrievable": false } ] }
Nasdílení dat do indexu pomocí rozhraní REST API
Naplňte vyhledávací index dokumenty, které poskytují hodnoty pro každé pole v kolekci polí, včetně hodnot pro pole zabezpečení. Azure AI Search neposkytuje rozhraní API ani funkce pro naplnění pole zabezpečení konkrétně. Několik příkladů uvedených na konci tohoto článku ale vysvětluje techniky pro naplnění tohoto pole.
Ve službě Azure AI Search jsou přístupy pro načítání dat následující:
- Jedna operace vložení nebo vyžádání (indexer), která importuje dokumenty naplněné všemi poli
- Více operací nabízení nebo vyžádání. Pokud sekundární operace importu cílí na správný identifikátor dokumentu, můžete načíst pole jednotlivě prostřednictvím více importů.
Následující příklad ukazuje jeden požadavek HTTP POST na kolekci dokumentů koncového bodu adresy URL indexu (viz Dokumenty – Index). Text požadavku HTTP je vykreslení dokumentů, které se mají indexovat:
POST https://[search service].search.windows.net/indexes/securedfiles/docs/index?api-version=2024-07-01
{
"value": [
{
"@search.action": "upload",
"file_id": "1",
"file_name": "secured_file_a",
"file_description": "File access is restricted to Human Resources.",
"group_ids": ["group_id1"]
},
{
"@search.action": "upload",
"file_id": "2",
"file_name": "secured_file_b",
"file_description": "File access is restricted to Human Resources and Recruiting.",
"group_ids": ["group_id1", "group_id2"]
},
{
"@search.action": "upload",
"file_id": "3",
"file_name": "secured_file_c",
"file_description": "File access is restricted to Operations and Logistics.",
"group_ids": ["group_id5", "group_id6"]
}
]
}
Pokud potřebujete aktualizovat existující dokument se seznamem skupin, můžete použít merge
tuto akci mergeOrUpload
:
{
"value": [
{
"@search.action": "mergeOrUpload",
"file_id": "3",
"group_ids": ["group_id7", "group_id8", "group_id9"]
}
]
}
Použití filtru zabezpečení v dotazu
Pokud chcete oříznout dokumenty na group_ids
základě přístupu, měli byste vydat vyhledávací dotaz s filtrem group_ids/any(g:search.in(g, 'group_id1, group_id2,...'))
, kde "group_id1, group_id2,..." jsou skupiny, do kterých patří vystavitel žádosti o vyhledávání.
Tento filtr odpovídá všem dokumentům, pro které group_ids
pole obsahuje jeden z daných identifikátorů.
Úplné podrobnosti o prohledávání dokumentů pomocí služby Azure AI Search najdete v tématu Dokumenty služby Search.
Tato ukázka ukazuje, jak nastavit dotaz pomocí požadavku POST.
Vyžádejte požadavek HTTP POST a zadejte filtr v textu požadavku:
POST https://[service name].search.windows.net/indexes/securedfiles/docs/search?api-version=2024-07-01
{
"filter":"group_ids/any(g:search.in(g, 'group_id1, group_id2'))"
}
Dokumenty byste měli získat zpátky tam, kde group_ids
jsou buď "group_id1", nebo "group_id2". Jinými slovy, získáte dokumenty, ke kterým má vystavitel požadavku přístup pro čtení.
{
[
{
"@search.score":1.0,
"file_id":"1",
"file_name":"secured_file_a",
},
{
"@search.score":1.0,
"file_id":"2",
"file_name":"secured_file_b"
}
]
}
Další kroky
Tento článek popisuje vzor filtrování výsledků na základě identity uživatele a search.in()
funkce. Tuto funkci můžete použít k předání identifikátorů objektu zabezpečení pro žadatele, aby se shodovaly s hlavními identifikátory přidruženými k jednotlivým cílovým dokumentům. Když se zpracuje požadavek vyhledávání, funkce vyfiltruje výsledky hledání, search.in
pro které žádný z objektů zabezpečení uživatele nemá přístup ke čtení. Identifikátory objektu zabezpečení můžou představovat například skupiny zabezpečení, role nebo dokonce vlastní identitu uživatele.
Další příklady, ukázky a videa: