2009-05-05 4 views
18

最初に私の質問の背景。セキュリティ(別名パーミッション)とLucene - どのように?それはすべきか?

  • 個々のエンティティはパーミッションを読み取ることができます。
  • ユーザーがの読み取り許可を読み取った場合、許可チェックでは、そのインスタンスは表示されません。
  • 問題は、Luceneを導入し、一致するエンティティインスタンスのリストを単純に返す検索を実行することに関する。私のコードはエンティティを1つずつフィルタリングする必要があります。このアプローチは、ユーザが少数の少数しか見ることができない場合があり、多くをチェックしていくつかを返すことが理想的でない場合があるため、非常に非効率的である。

    開発者はこの問題をどのように解決するか、どのように解決するのですか?Luceneを使用してインデックスや検索を実行することに留意してください。

    EDIT

    定義

    • ユーザーは多くのグループに属していてもよいです。
    • ロールには複数のグループが含まれている可能性があります。これらのグループは変更できます。
    • 権限にはロールがあります(間接)。
    • Xに読み取りアクセス権を設定できます。
    • ロールの定義はいつでも変更できます。

    インデックス

    • 指標時グループ(Permmissionを拡張)のセットを追加すると、ロール変更のための部材群のリスト同期してなりつつ定義をもたらし得ます。
    • パーミッション/ロールの定義が変更されるたびに、Xを再インデックスする必要がないようにしたいと考えています。

    セキュリティチェック

    • は、ユーザーがグループのセット内にあるグループに属している必要がありパーミッションチェックを渡すために与えられた許可のための役割に属しています。

    答えて

    7

    状況によって異なるセキュリティグループの数と、セキュリティがインデックスデータにどのように適用されるかによって異なります。

    私たちは次のように解決した同様の問題を抱えていました。インデックスを作成するときに許可されたグループをドキュメントに追加し、検索するときに、ユーザーがメンバーだったグループを含むブールクエリを追加しました。それは我々のシナリオではうまくいった。

    +0

    おそらく、私たちは非常によく似たようなことをしました。インデックス付きオブジェクトは、メタデータフィールドの読み取り権限を持つグループid:sを持っています。 "G1、G6、G203"と "contains G1 or G70"また、別のプレフィックスを使用することによってユーザーにも拡張されます。 – Manne

    +0

    私は同じアイデアを使用しています。私の具体的な実装は次のとおりです。http://lifeinide.blogspot.com/2013/02/lucene-permissions-and-hibernate-search.html –

    3

    セキュリティモデルによって異なります。アクセス権がシンプルである - たとえば、3つのクラスのドキュメントがある場合 - クラスごとに別々のLuceneインデックスを作成し、ユーザーが複数のクラスを参照できるときに結果をマージすることが最善の方法です。 The Solr security Wikiは、HakonBの提案に類似したものを提案しています。つまり、ユーザーの資格情報をクエリに追加して検索します。 this discussion in the Lucene user groupも参照してください。 もう1つの戦略は、Luceneからの追加のフィルタリングを行う別のセキュリティクラスでLucene検索をラップすることです。アクセス許可のデータベースを使用してこれを行うことができる場合は、より高速になる場合があります。

    編集: あなたにはかなり複雑な権限システムがあります。あなたの基本的な設計の選択肢は、それをLuceneの内部に実装するかLuceneの外部に実装するかです。私のアドバイスはLuceneを検索エンジン(主な強み)として使用し、セキュリティのために別のシステム/アプリケーションを使用することです。とにかくセキュリティのためにLuceneを使用することを選択した場合は、Lucene Filtersをよく学び、ビットセットフィルタを使用してクエリの結果をフィルタリングすることをお勧めします。権限を更新したままにしなければならないという問題があります。

    +0

    私はオリジナルの質問にもっと詳しく説明します。 。 –

    +0

    オリジナルの答えに詳細を追加しました。 HTH –

    0

    Yuvalが述べたように、許可メカニズムをluceneインデックスから独立させる価値があります。

    これを実行する1つの方法は、ユーザーがアクセスしてはいけない結果を除外する独自のCollectorを実装することです。

    0

    私は何を示唆していることは、文書の2種類持っている:「文書ID」

    2)フィールドを持つセキュリティ文書:「役割」「グループ」「ユーザー

    1)と呼ばれるフィールドでReal_documents 「 『PermisionId』 『DocumentsIds』

    その後、擬似コードは次のようになります。

    Field[] docIds =searcher.search("Users", "currentUser").getFields("DocumentIds"); 
        TermsFilter filter = new TermFilter(); 
    
        foreach(field:docIDs){ 
         filter.add(new Term(field.field(),field.text()); 
        } 
        searcher.search(query.getWeight(searcher), filter, numberOfDocuments); 
    

    はLuceneの2件の検索を検索する上で非常に高速であるということで作るのはとても簡単です。このようにして、ユーザーごとにより良いtf-idfが得られます。