2012-04-04 11 views
4

(中程度に複雑な)セキュリティモデルを必要とするLiferayでの検索の実装経験はありましたか?検索エンジンから返された結果のすべてにコンテンツを表示する権限があるわけではないという事実にどう対処していますか? Liferayの組み込み検索はすでにこれを行っていますか?はいの場合、どうですか?Liferay、検索およびセキュリティモデル

返された後に何千もの結果がフィルタリングされる可能性があるため、かなり高価になる可能性があります。また、フィルタを使用して結果をすべて渡すことができない場合、ログインしたユーザーとして検索できる合計結果(ヒット)の数がわかりません。

答えて

1

私はluceneから最初に検索し、ユーザーがその閲覧許可を持っているかどうかを確認すると思います。ソースコードにアクセスできるかどうかを確認するには、BaseIndexer.searchを参照してください。私はそれをどのようにあなたに示すために、小さなスニペットを添付していますか?

PermissionChecker permissionChecker = 
       PermissionThreadLocal.getPermissionChecker(); 

int start = searchContext.getStart(); 
int end = searchContext.getEnd(); 

if (isFilterSearch() && (permissionChecker != null)) { 
    searchContext.setStart(0); 
    searchContext.setEnd(end + INDEX_FILTER_SEARCH_LIMIT); 
} 

Hits hits = SearchEngineUtil.search(searchContext, fullQuery); 

searchContext.setStart(start); 
searchContext.setEnd(end); 

if (isFilterSearch() && (permissionChecker != null)) { 
    hits = filterSearch(hits, permissionChecker, searchContext); 
} 
+0

うん、それは私が思ったものです。これは非常に非効率的です。何千もの関連する結果があればどうでしょうか?現在のユーザーが実際に見ることができる関連する結果の合計数を取得する前に、このフィルタを通過する必要があります。 –

+0

ページングは​​問題ではないことに注意してください。一つのページに表示する必要のある結果の数(詩的に聞こえる!)が表示されるまで許可チェックのみが可能ですが、表示できる関連性の高い結果を知るには、この小切手を通過します。このチェックは、状況を悪化させるようなDBへのクエリを実行していると思います!別の方法が必要です! –

関連する問題