2011-11-17 7 views
4

ACL 보안과 함께 Spring Security를 ​​사용하여 응용 프로그램의 문서를 보호합니다. 반면에 나는 문서를 검색하기 위해 최대 절전 모드 검색 (lucene 상단에)을 사용한다. 이 검색은 페이징도 지원합니다. (문서는 데이터베이스에 저장된 문서의 메타 데이터입니다.)Hibernate Search (Lucene)와 페이징 및 ACL을 결합하는 방법

FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager); 
QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Document.class).get(); 
Query query = queryBuilder.keyword().onFields(fieldNames.toArray(new String[0])).matching(searchQuery) 
      .createQuery(); 

FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery(query, Document.class); 
fullTextQuery.setFirstResult(pageable.getFirstItem()); 
fullTextQuery.setMaxResults(pageable.getPageSize()); 

지금은 ACL을 사용하여 페이징을 결합해야합니다. 필자가 가지고있는 유일한 아이디어는 FullTextQuery 페이징 폼을 제거하고 모든 검색 결과 문서를 읽고, ACL에 따라 필터링 한 다음 수동으로 페이징을 수행하는 것입니다. 그러나 나는 그 해결책을 좋아하지 않는다. 페이지를위한 것이 아니라 모든 문서를 적재하기 때문이다.

누구에게 더 좋은 아이디어가 있습니까?

답변

2

나는 똑같은 문제에 부딪 쳤고 간단한 대답이 있다고 생각하지 않는다.

두 가지 해결책이 있다고 생각합니다. 문서를로드하고 각 결과에 대해 ACL을 분석 한 다음 자신의 페이징을 수행해야하므로 성능 문제가있는 제안 된 문서가 있습니다. 또 다른 방법은이 작업을 색인 작업쪽으로 밀어 넣고 Lucene에서 ACL을 색인하는 것입니다. 이렇게하면 현재 사용자/그룹/사용 권한/역할을 기반으로 필터 용어를 추가하여 사용자가 볼 수없는 결과가 숨겨 지지만 ACL 정보로 색인을 유지 관리하는 대신 검색 성능이 향상됩니다. ACL이 단순하다면 이것이 옵션 일 수 있습니다. ACL이 계층 적이면 여전히 옵션이지만 더 복잡합니다. ACL을 사용하여 색인을 최신 상태로 유지하는 것도 까다로운 작업입니다.

이 기능을 살펴보기 시작하면 데이터베이스/Hibernate/Lucene 솔루션을 확장하기 시작했다는 것을 나타낼 수 있습니다. Jackrabbit과 같은 콘텐츠 저장소가 더 적합할까요? 아마도 이것은 아마도 너무 먼 단계 일지 모르지만 그것이 어떻게되는지보기 위해 가치가있을 것입니다. 또는 SOLR을 살펴보십시오. 특히이 문제가 무엇인지 설명하는 issue입니다.

4

ACL이 너무 복잡하지 않은 경우 레벨이 작고 한정되어 있으므로 Filter 및 Bitset을 사용하여 구현하십시오.

그리고 여기 당신은 추가 예제 당신이 (그것이 내 오픈 소스 웹 애플리케이션의 최소 5 년 동안 생산되었습니다 캐시 된 비트 세트 필터 구현을 찾을 수 있습니다 필터 다음 http://java.dzone.com/articles/how-implement-row-level-access

와 ACL 구현을 찾을 수 있습니다 검색 병렬 텍스트 말뭉치)를 addSourceFilter 방법에 대한

봐는 http://code.google.com/p/hunglish-webapp/source/browse/trunk/src/main/java/hu/mokk/hunglish/lucene/LuceneQueryBuilder.java

0

Here 사용하여 복잡한 사용자/그룹/역할 계층 ACL 시스템 내 ACL 구현입니다 순수한 Lucene 쿼리 (Hibernate Search 상단).

관련 문제