2012-04-04 5 views
4

У кого-нибудь есть опыт реализации поиска на Liferay, который требует (умеренно сложной) модели безопасности? Как вы справляетесь с тем, что не все результаты, которые вы получаете от поисковой системы, будут иметь разрешения на просмотр содержимого? Выполняет ли встроенный поиск в Liferay? Если да, то как?Liferay, Search and Security Model

Поскольку фильтрация потенциально тысяч результатов после их возврата может быть довольно дорогостоящей. И если вы не передадите все результаты через фильтр, вы не знаете, сколько итоговых результатов (хитов) вашего поиска было получено вами, как зарегистрированного пользователя, «см.».

ответ

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

Yup, вот что я и думал. Это очень неэффективно. Что делать, если у вас есть тысячи релевантных результатов. Им нужно будет пройти этот фильтр, прежде чем вы получите общее количество релевантных результатов, которые может видеть текущий пользователь. –

+0

Обратите внимание, что пейджинг не является проблемой, можно только проверить разрешение до тех пор, пока у вас не будет числа результатов, которые нужно показать на одной странице (это было поэтично!), Но чтобы узнать общие релевантные результаты, которые могут быть показаны, все результаты должны пройти эту проверку. Эта проверка, по моему мнению, также вызывает запросы в БД, что делает ситуацию хуже! Должен быть другой путь! –