2017-12-19 3 views
0

Ich versuche, einen Sicherheitsfilter zu erstellen, der bestimmte Benutzer davon ausschließt, bestimmte Dokumente in elasticsearch zu sehen. Wenn ein Dokument beispielsweise "ABC: 123" und "ABC: XYZ" enthält, muss der Benutzer beide in seinem Profil haben, um das Dokument zu sehen. Wir erstellen dies im Handumdrehen mithilfe von Moustache-Vorlagen. Mein erster Versuch war in dieser Richtung:Erstellen eines Sicherheitsfilters in elasticsearch

"bool": { 
    "filter": { 
     "bool": { 
      "minimum_should_match": 1, 
      "should": { 
       "bool": [{ 
        "must_not": { 
         "prefix": { 
          "controlSet": "ABC:" 
         } 
        } 
       },{ 
        "must": { 
         "terms": { 
          "controlSet": ["ABC:123","ABC:XYZ"] 
         } 
        } 
       }] 
      } 
     } 
    } 
} 

Allerdings habe ich schnell gemerkt, dass dies einen Benutzer mit einer Steuerung ermöglicht, ein Dokument anzuzeigen, die mehrere hat. Ein Dokument muss über eine Teilmenge der Steuerelemente verfügen, denen der Benutzer zugeordnet werden muss. Wenn der Benutzer also "ABC: XYZ" hat, sollte er nicht in der Lage sein, ein Dokument mit "ABC: 123" zu sehen, auch wenn das Dokument auch "ABC: XYZ" enthält.

Gibt es eine Möglichkeit, dies zu erreichen, die ich vermisse? Zur Zeit listen wir die Kontrolle im System auf und fügen sie zu einer must_not hinzu, kontrollieren aber die Änderung in regelmäßigen Abständen und ich würde diese Liste lieber nicht manuell pflegen.

Antwort

0

Ich habe vielleicht eine Lösung gefunden ..

{ 
    "bool": { 
     "must_not": { 
      "regexp": { 
       "value": "ABC:~(XYZ|123)", 
       "flags": "COMPLEMENT" 
      } 
     } 
    } 
} 

, die mit Dokumenten entweder ABC erlauben sollte. XYZ oder ABC: 123 (oder beide) unter Ausschluss von Dokumenten mit ABC: [etwas anderes]

Natürlich bin ich besorgt über die Geschwindigkeit des regexp aber ich denke, das Fehlen von Wildcards wird es relativ schnell machen.

0

Angenommen, Ihr Dokument sieht wie folgt aus:

{ 
    ... 
    "controlSet": ["ABC:123", "ABC:XYZ"], 
    ... 
} 

und controlSet ist ein keyword Feld, die folgende Abfrage sollte es tun:

{ 
    "bool": { 
     "filter": { 
      "terms": { 
       "controlSet": ["ABC:123", "ABC:XYZ"] 
      } 
     } 
    } 
} 

Es wird Dokumente gefunden mit controlSet zumindest mit ABC:123 und ABC:XYZ

+0

Das Problem ist, dass "controlSet": ["ABC: 123"] 'wird auch übereinstimmen. Ich brauche eine Möglichkeit, um zu erzwingen, dass der Benutzer eine Obermenge von Steuerelementen hat, die das Dokument hat. – Derek

Verwandte Themen