Перейти к содержимому
DedicatedPHP Контакт

Семантический поиск с правами доступа в PHP

Спроектируйте семантический поиск на PHP, учитывающий права, отзыв доступа и чувствительные фрагменты, не превращая индекс в источник утечки данных.

Редакционная диаграмма семантического поиска в PHP с индексом, фильтрами прав доступа и проверкой доступа

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

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

Решения, которые необходимо принять до индексации

Решения, которые необходимо принять до индексации — guía visual de DedicatedPHP

Начните с определения корпуса и его модели доступа. Не весь контент имеет одинаковый жизненный цикл или чувствительность: публичная политика, внутреннее руководство, дело и файл с внешним доступом требуют разных правил. Также необходимо решить, какое действие разрешает поиск: найти заголовок, прочитать выдержку, открыть документ, скачать вложение или запросить сводку. Разрешение на обнаружение не обязательно означает разрешение на чтение.

  • Субъект доступа: пользователь, сервисная учётная запись или делегированная сессия, выполняющая запрос.
  • Область: организация, рабочее пространство, проект, дело или репозиторий, в которых разрешён поиск.
  • Действие: обнаружение, чтение, скачивание или администрирование.
  • Ресурс: документ и фрагмент с их состоянием, классификацией и принадлежностью.
  • Допустимость ошибок: при авторизации приоритетом должно быть нераскрытие; ложноотрицательный результат неудобен, ложноположительный может стать утечкой.

Векторное сходство не понимает бизнес-правил. Embedding представляет близость значений, а не законность доступа. Поэтому в дизайне нельзя полагаться на то, что «похожий» результат безопасен, или на то, что генеративная модель проигнорирует недопустимый контекст.

Референсная архитектура и источник истины

Храните права доступа в транзакционном источнике истины: PHP-приложении, его базе данных или системе управления документами, которая управляет ресурсами. Индекс — это восстанавливаемая проекция, а не орган, принимающий решение о доступе. Если индекс повреждён, отстаёт или получает неполные данные, слой авторизации должен иметь возможность предотвратить выдачу.

Надёжный поток разделяет четыре этапа:

  1. Контент извлекается из идентифицируемой версии документа и делится на фрагменты с согласованными границами.
  2. Вычисляются представления для извлечения и сохраняются вместе с метаданными области и версии.
  3. Запрос формирует фильтр, выведенный из прав субъекта доступа, и извлекает кандидатов только в пределах этой области.
  4. Приложение повторно проверяет разрешение и актуальность каждого кандидата перед его отображением или использованием в качестве контекста.

В PHP инкапсулируйте эти обязанности. Сервис политик должен разрешать can($principal, 'read', $documento); адаптер индекса должен получать фильтры, производные от этого решения; а сборщик результатов должен принимать только проверенных кандидатов. Не позволяйте контроллерам, шаблонам или промптам самостоятельно составлять фильтры прав доступа.

Метаданные, позволяющие фильтровать без догадок

Каждому документу и фрагменту необходимы стабильный идентификатор организации и ресурса, версия контента, статус индексации и ссылка на родительский документ. Добавляйте атрибуты, необходимые для выражения политики, но не дублируйте чувствительные данные без необходимости.

  • tenant_id или организация: обязательный барьер в мультиклиентских средах.
  • document_id и chunk_id: прослеживаемость от результата до источника.
  • acl_revision: версия политики, применённая при индексации.
  • audience: простая область, например внутренняя аудитория, команда, проект или дело.
  • lifecycle_state: активен, архивирован, удалён или ожидает проверки.
  • content_revision: предотвращает цитирование уже заменённой версии.

Не индексируйте гигантский список пользователей для каждого фрагмента, если политика основана на изменяющихся группах: это повышает стоимость, раскрывает связи и плохо устаревает. По возможности предпочтительнее фильтровать по стабильным областям и разрешать исключения при последующей проверке. Если движок извлечения не поддерживает надёжные фильтры, он не должен получать контент из нескольких областей безопасности в одном доступном для запросов пространстве.

Фильтрация до извлечения и проверка после

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

Последующая проверка всё равно необходима. Права могут измениться между запросом и чтением, наследование может зависеть от данных, не спроецированных в индекс, либо индекс может отставать. Для каждого кандидата получите текущий документ или обратитесь к кэшу авторизации с безопасной инвалидацией. Если проверка не пройдена, отбросьте фрагмент, не раскрывая его заголовок, оценку или само существование.

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

Наследование, ссылки и отзывы доступа, разрушающие простые решения

Группы, наследуемые папки и общие ссылки вносят косвенные изменения. Уход человека из группы, перемещение документа в другую папку или истечение срока действия ссылки должны влиять как на открытие, так и на извлечение. Явно моделируйте приоритет между прямыми разрешениями, наследованием и запретами и тестируйте конфликты.

Отзывы доступа требуют более строгой стратегии, чем предоставления. Публикуйте события изменения контента и ACL через транзакционную очередь или журнал изменений; рабочий процесс пересчитывает метаданные и удаляет или переиндексирует фрагменты. Пока индекс сходится, последующая проверка защищает выдачу. При удалении немедленно помечайте ресурс как недоступный в источнике истины и асинхронно очищайте его фрагменты, отправляя оповещения, если задержка превышает операционную цель.

Проверяемые результаты, тестирование и наблюдаемость

Показывайте заголовок, ограниченную выдержку, расположение и дату только в том случае, если эти поля также доступны для чтения. Каждый результат должен вести к исходному авторизованному ресурсу; цитата не должна раскрывать путь, автора или текст скрытого документа. При отсутствии результатов используйте нейтральное сообщение: не подтверждайте существование контента за пределами области доступа пользователя.

Создайте матрицу тестов с пользователями из разных организаций, участниками и неучастниками групп, ограниченными администраторами, просроченными ссылками и ресурсами, доступ к которым отозван во время сессии. Проверяйте прямые запросы, синонимы, редкие термины и вопросы, специально сформулированные для привлечения запрещённого контента. Ожидаемые результаты включают пустые списки, когда всё релевантное запрещено.

Логируйте, не сохраняя без необходимости чувствительные запросы, версию индекса, применённые фильтры, число кандидатов до и после проверки, задержку, отказы и отставание синхронизации. Рост числа отброшенных после проверки кандидатов может указывать на устаревшие ACL; ноль результатов после миграции может сигнализировать о чрезмерных фильтрах; межорганизационные запросы предупреждают о проблеме изоляции.

Когда выбрать другое решение и итоговый список

Когда выбрать другое решение и итоговый список — guía visual de DedicatedPHP

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

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