2017-12-19 6 views
0

elasticsearchで特定のユーザーが特定のドキュメントを参照できないようにするセキュリティフィルタを作成しようとしています。例として、文書に「ABC:123」と「ABC:XYZ」が含まれている場合、ユーザーはその文書を見るためにプロファイルにそれらの両方を持たなければなりません。私達は口ひげのテンプレートを使ってこれを作成しています。私の最初の試みは、これらの行に沿ったものでした:elasticsearchでセキュリティフィルタを作成する

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

しかし、私はすぐに、1つのコントロールを持つユーザーが複数のドキュメントを表示できるようになりました。ドキュメントには、ユーザーが一致させる必要があるコントロールのサブセットが必要です。したがって、ユーザーに「ABC:XYZ」がある場合にのみ、「ABC:XYZ」が含まれていても、「ABC:123」の文書を見ることができません。

これを達成する方法はありますか?私は行方不明ですか?現在、私たちはシステム内の制御を列挙し、それらをmust_notに追加しますが、制御を定期的に変更して、そのリストを手動で維持しないでください。あなたの文書を想定し

答えて

0

解決策を見つけた可能性があります。 ABCとの文書を排除しながら123(あるいはその両方):XYZまたはABC:ABCのいずれかで文書を許可する必要があり

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

もちろん[何か]

私は正規表現の速度が心配です私はワイルドカードの欠如がそれを比較的速くすると思う。

0

は、次のようになります。

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

controlSetkeywordフィールドで、次のクエリは、トリックを行う必要があります。

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

をそれは、少なくとも持っcontrolSetと書類と一致しますとABC:XYZ

+0

問題は '' controlSet ":[" ABC:123 "]'も一致します。私は、ユーザーがドキュメントにあるコントロールのスーパーセットを持っていることを強制するいくつかの方法が必要です。 – Derek

関連する問題