search:search возвращает результаты в консоли запросов, но не дает результатов, когда его получает приложение из http по get?

У меня странная ситуация здесь. Я пытаюсь создать приложение, которое отправляет запрос http get на сервер MarkLogic. Поражает код XQuery, который выполняет search:search(""), Я передаю пустой запрос на поиск, поэтому возвращаются релевантные результаты по умолчанию.
И я использую Roxy для развертывания. Когда я вызываю типичную функцию развертывания Roxy командой -

ml local deploy content.  

Он загружает весь документ и позже, когда я нажимаю localhost:7040, я получаю результаты, как и ожидалось. Все идет нормально.
Теперь я переопределяю существующий метод Roxy deploy_content и определяю свой новый метод, который вызывает функцию XQuery, которая выполняет xdmp:document-load() загрузить все данные в базу данных контента. Вот фрагмент кода -

declare function loadTS:load($path) {
    let $result :=
        for $d in xdmp:filesystem-directory($path)//dir:entry
            let $log := xdmp:log(fn:concat("$d-->",xdmp:describe($d)))
            return xdmp:document-load($d//dir:pathname,
                <options xmlns="xdmp:document-load">
                    <uri>{fn:concat("/",$d//dir:filename)}</uri>
                    <permissions>{xdmp:default-permissions()}</permissions>
                    <format>xml</format>
                    <collections>
                        <collection>all</collection>
                    </collections>
                </options>)
     return $result
};

Теперь, когда я нажимаю на приложение, я получаю 0, в то время как тот же код отлично работает в консоли запросов. Я думаю, что это связано с концепцией ролей и привилегий, потому что когда я предоставляю роль администратора вновь созданному пользователю из roxy, я получаю результат, как и ожидалось. Я не хочу предоставлять роль администратора пользователям по умолчанию, которые будут использовать мое приложение позже. Итак, какие изменения мне нужно сделать с точки зрения ролей, привилегий и аутентификации, которые решат мою проблему?
Примечание: когда я нажимаю localhost:7040, он не запрашивает аутентификацию.

ml.app-role:xyz-role  

Есть ли функция для получения всех разрешений по умолчанию под ролью этого пользователя.
Это пользователь, используемый для сервера приложений, так как это скорее ванильная установка.
Пользователь, используемый для консоли запросов, является администратором.
Я управлял командой xdmp:document-get-permissions() к одному из загруженных документов, но он вернул пустую последовательность.
xdmp:document-get-permissions("/a-ha+Take-on-Me.xml"),
аутентификации метод = прикладной уровень

2 ответа

Вы много говорите, но никогда ничего не упоминаете о безопасности:

  • Пользователь, с которым вы развертываете?
  • Разрешения по умолчанию, перечисленные в списке ролей этого пользователя?
  • Пользователь использовал для сервера приложений?
  • Пользователь использовал для запроса консоли?
  • Фактические разрешения, приложенные к образцу документа?

Чтобы быстро отследить эту помощь, я отвечу, если предположить, что ML и Roxy были очень ванильными:

  • Скорее всего, вы используете консоль запросов в качестве администратора.
  • Вы, вероятно, используете
  • Развертывание Рокси в качестве администратора. Скорее всего, вы используете другого пользователя через сервер приложений.

Ваш код выше использует разрешения по умолчанию пользователя через Roxy. Если администратор, то, возможно, не будет никаких разрешений по умолчанию, потому что администратор обходит почти всю безопасность (включая даже необходимость разрешения на запись в документы).

Главное, на что нужно обратить внимание: https://docs.marklogic.com/xdmp:document-get-permissions для одного из документов.

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

Лонгин не нужен? Это потому, что вы установили логин на уровне приложения и, вероятно, используете только пользователя по умолчанию из Roxy. Нужна аутентификация? Перейдите к дайджесту и определите больше пользователей / ролей в конфигурации Roxt xml.

Какие роли нужны? Ну, вам нужен по крайней мере один пользователь (не администратор) с триггерами, чтобы использовать ваше приложение и доступ для чтения и записи к вашим документам. Объяснение более того сделает слишком много предположений. Вам необходимо понять модель безопасности и сделать свой собственный выбор. Но в качестве примера создайте "user1" с паролем и ролью "user1", а также предоставьте этот доступ к роли для пользователя приложения, как определено в Roxy, и установите для аутентификации дайджест. Теперь у вас есть аутентификация и пользователь, который может использовать ваше приложение с паролем. Измените приведенный выше скрипт загрузки документов, чтобы предоставить доступ для чтения / записи загруженных документов к роли user1.

Теперь у вас есть приложение с:

  • Пользователь, чтобы войти с
  • Auhentication
  • Загруженные документы, которые могут быть прочитаны этим пользователем (и изменены).

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

Не достаточно, чтобы исправить вещи? Ответьте на вопросы, которые я упомянул выше, и люди смогут помочь.

Дэвид сделал хорошие очки, но я думаю, что я знаю, что происходит..

Когда ты бежишь ml local deploy content с готовым приложением Roxy оно загружает файлы в ваш файл content-db, в то же время явно устанавливая разрешения документов для роли приложения. Он применяет, по крайней мере, разрешения на чтение и обновление, может также выполнять.

Если вы переопределяете встроенный контент развертывания с помощью пользовательского кода и не используете внутренние методы Roxy, такие как load_data, вы должны применить эти разрешения самостоятельно. С помощью xdmp:default-permissions() вероятно, не достаточно хорош, так как по умолчанию Roxy развертывается с использованием admin, и для него обычно не определены разрешения по умолчанию, и маловероятно, что это будут права на чтение / обновление для роли приложения, которым вы оказались работать с.

Наиболее элегантным выходом из ситуации будет использование пользователя для загрузки приложения с правильными разрешениями по умолчанию. Вам придется настроить это самостоятельно, а затем каким-то образом убедиться, что Roxy использует его.

Более простой выход - заменить xdmp:default-permissions() в вашем loadTS:load функция с явным xdmp:permission звонки, либо для жестко закодированных xyz-role, или лучше $app-name || "-role" где $app-name будет загружен через src/app/config/config.xqyили вы проходите $app-name через ваш обычай deploy_content,

НТН!

Другие вопросы по тегам