Я столкнулся с той же проблемой, и я не думаю, что есть простой ответ.
Я думаю, что есть только два решения.Тот, который вы предложили, имеет проблемы с производительностью, которые вы описали, так как вам нужно загрузить документы и разрешить ACL для каждого результата, а затем выполнить собственную подкачку страниц.Альтернатива состоит в том, чтобы перенести эту работу на сторону индексации и индексировать свой ACL в Lucene.Это дает вам производительность поиска, скрывая результаты, которые пользователь не может видеть, добавляя условия фильтра на основе текущего пользователя / группы / разрешений / ролей, но за счет поддержки индекса информацией ACL.Если ваш ACL прост, то это может быть вариант.Если ваш ACL является иерархическим, то это все еще вариант, но более сложный.Также сложно поддерживать ваш индекс в актуальном состоянии с помощью ACL.
Тот факт, что вы начинаете изучать такого рода функциональные возможности, может указывать на то, что вы начинаете расширять свое решение Database / Hibernate / Lucene.Может быть, лучше подойдет репозиторий контента, такой как Jackrabbit?Я думаю, что это, вероятно, слишком далеко, но, возможно, стоит взглянуть, как это происходит.В качестве альтернативы взгляните на SOLR, в частности, на этот вопрос , в котором описывается, что это за острая проблема.