Поиск, который находит документ, к которому у пользователя нет доступа, уже потерпел неудачу, даже если интерфейс скрывает конечную ссылку. В системах управления документами, делах, бэкофисах и базах знаний риск возникает раньше: в индексе, извлечённых фрагментах, отображаемых метаданных и в ответе, сгенерированном на основе неавторизованного контекста.
Семантический поиск с правами доступа в PHP должен рассматривать авторизацию как часть извлечения, а не как декоративную проверку в представлении. Цель состоит не только в том, чтобы возвращать полезные результаты: необходимо гарантировать, что каждый фрагмент-кандидат, цитата и ответ получены исключительно из контента, который аутентифицированный субъект доступа может просматривать в данный момент.
Решения, которые необходимо принять до индексации

Начните с определения корпуса и его модели доступа. Не весь контент имеет одинаковый жизненный цикл или чувствительность: публичная политика, внутреннее руководство, дело и файл с внешним доступом требуют разных правил. Также необходимо решить, какое действие разрешает поиск: найти заголовок, прочитать выдержку, открыть документ, скачать вложение или запросить сводку. Разрешение на обнаружение не обязательно означает разрешение на чтение.
- Субъект доступа: пользователь, сервисная учётная запись или делегированная сессия, выполняющая запрос.
- Область: организация, рабочее пространство, проект, дело или репозиторий, в которых разрешён поиск.
- Действие: обнаружение, чтение, скачивание или администрирование.
- Ресурс: документ и фрагмент с их состоянием, классификацией и принадлежностью.
- Допустимость ошибок: при авторизации приоритетом должно быть нераскрытие; ложноотрицательный результат неудобен, ложноположительный может стать утечкой.
Векторное сходство не понимает бизнес-правил. Embedding представляет близость значений, а не законность доступа. Поэтому в дизайне нельзя полагаться на то, что «похожий» результат безопасен, или на то, что генеративная модель проигнорирует недопустимый контекст.
Референсная архитектура и источник истины
Храните права доступа в транзакционном источнике истины: PHP-приложении, его базе данных или системе управления документами, которая управляет ресурсами. Индекс — это восстанавливаемая проекция, а не орган, принимающий решение о доступе. Если индекс повреждён, отстаёт или получает неполные данные, слой авторизации должен иметь возможность предотвратить выдачу.
Надёжный поток разделяет четыре этапа:
- Контент извлекается из идентифицируемой версии документа и делится на фрагменты с согласованными границами.
- Вычисляются представления для извлечения и сохраняются вместе с метаданными области и версии.
- Запрос формирует фильтр, выведенный из прав субъекта доступа, и извлекает кандидатов только в пределах этой области.
- Приложение повторно проверяет разрешение и актуальность каждого кандидата перед его отображением или использованием в качестве контекста.
В PHP инкапсулируйте эти обязанности. Сервис политик должен разрешать can($principal, 'read', $documento); адаптер индекса должен получать фильтры, производные от этого решения; а сборщик результатов должен принимать только проверенных кандидатов. Не позволяйте контроллерам, шаблонам или промптам самостоятельно составлять фильтры прав доступа.
Метаданные, позволяющие фильтровать без догадок
Каждому документу и фрагменту необходимы стабильный идентификатор организации и ресурса, версия контента, статус индексации и ссылка на родительский документ. Добавляйте атрибуты, необходимые для выражения политики, но не дублируйте чувствительные данные без необходимости.
- tenant_id или организация: обязательный барьер в мультиклиентских средах.
- document_id и chunk_id: прослеживаемость от результата до источника.
- acl_revision: версия политики, применённая при индексации.
- audience: простая область, например внутренняя аудитория, команда, проект или дело.
- lifecycle_state: активен, архивирован, удалён или ожидает проверки.
- content_revision: предотвращает цитирование уже заменённой версии.
Не индексируйте гигантский список пользователей для каждого фрагмента, если политика основана на изменяющихся группах: это повышает стоимость, раскрывает связи и плохо устаревает. По возможности предпочтительнее фильтровать по стабильным областям и разрешать исключения при последующей проверке. Если движок извлечения не поддерживает надёжные фильтры, он не должен получать контент из нескольких областей безопасности в одном доступном для запросов пространстве.
Фильтрация до извлечения и проверка после
Предварительная фильтрация уменьшает поверхность раскрытия: семантический запрос должен включать организацию, активный статус и разрешённые области до вычисления финальных кандидатов. Это предотвращает влияние запрещённого текста на ранжирование, выдержки или контекст ответа с поддержкой ИИ.
Последующая проверка всё равно необходима. Права могут измениться между запросом и чтением, наследование может зависеть от данных, не спроецированных в индекс, либо индекс может отставать. Для каждого кандидата получите текущий документ или обратитесь к кэшу авторизации с безопасной инвалидацией. Если проверка не пройдена, отбросьте фрагмент, не раскрывая его заголовок, оценку или само существование.
При наличии генерации с поддержкой ИИ передавайте модели только уже авторизованные и проверенные фрагменты. Определите конкретный сценарий использования, например создание сводки извлечённых результатов; оценивайте ответы на разрешённых и запрещённых случаях; сохраняйте проверяемые цитаты; ограничивайте стоимость каждого запроса; и поддерживайте альтернативу без генерации, например список результатов. Модель не заменяет политику доступа или человеческий контроль над чувствительным контентом.
Наследование, ссылки и отзывы доступа, разрушающие простые решения
Группы, наследуемые папки и общие ссылки вносят косвенные изменения. Уход человека из группы, перемещение документа в другую папку или истечение срока действия ссылки должны влиять как на открытие, так и на извлечение. Явно моделируйте приоритет между прямыми разрешениями, наследованием и запретами и тестируйте конфликты.
Отзывы доступа требуют более строгой стратегии, чем предоставления. Публикуйте события изменения контента и ACL через транзакционную очередь или журнал изменений; рабочий процесс пересчитывает метаданные и удаляет или переиндексирует фрагменты. Пока индекс сходится, последующая проверка защищает выдачу. При удалении немедленно помечайте ресурс как недоступный в источнике истины и асинхронно очищайте его фрагменты, отправляя оповещения, если задержка превышает операционную цель.
Проверяемые результаты, тестирование и наблюдаемость
Показывайте заголовок, ограниченную выдержку, расположение и дату только в том случае, если эти поля также доступны для чтения. Каждый результат должен вести к исходному авторизованному ресурсу; цитата не должна раскрывать путь, автора или текст скрытого документа. При отсутствии результатов используйте нейтральное сообщение: не подтверждайте существование контента за пределами области доступа пользователя.
Создайте матрицу тестов с пользователями из разных организаций, участниками и неучастниками групп, ограниченными администраторами, просроченными ссылками и ресурсами, доступ к которым отозван во время сессии. Проверяйте прямые запросы, синонимы, редкие термины и вопросы, специально сформулированные для привлечения запрещённого контента. Ожидаемые результаты включают пустые списки, когда всё релевантное запрещено.
Логируйте, не сохраняя без необходимости чувствительные запросы, версию индекса, применённые фильтры, число кандидатов до и после проверки, задержку, отказы и отставание синхронизации. Рост числа отброшенных после проверки кандидатов может указывать на устаревшие ACL; ноль результатов после миграции может сигнализировать о чрезмерных фильтрах; межорганизационные запросы предупреждают о проблеме изоляции.
Когда выбрать другое решение и итоговый список

Семантический поиск не всегда оправдан. Для небольших каталогов и стабильной терминологии фильтры, текстовый поиск и иерархическая навигация более объяснимы и дешевле. Они также предпочтительны, когда права доступа очень динамичны, а движок не может безопасно фильтровать по атрибутам. Используйте семантическое извлечение, когда оно действительно добавляет ценность запросам, сформулированным на естественном языке, и можно поддерживать полный контроль доступа.
- Источник истины принимает решение о доступе, а индекс можно перестроить.
- Все фрагменты имеют организацию, документ, версию и состояние.
- Запрос фильтрует до извлечения и проверяет до выдачи.
- Предоставления, изменения, отзывы и удаления имеют наблюдаемую синхронизацию.
- Ответы с поддержкой ИИ используют только авторизованный контекст, цитаты и альтернативу без ИИ.
- Тесты включают преднамеренные попытки неправомерного доступа и пустые результаты.



