Неспособность создать пользовательские разрешения для ограничения содержимого

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

Я использую MarkLogic 8 и Roxy для создания и развертывания приложения.

Это приложение имеет разных пользователей, которые имеют контент, который должен быть ограничен отдельным пользователем. Но они также участвуют в проектах, в которых им необходимо сотрудничать.

Я видел этот полезный блог и обсуждение проблемы GitHub 303, но все еще не смог понять это правильно.

Роль пользователя приложения roxy по умолчанию:

<role>
  <role-name>${app-role}</role-name>
  <description>A role for users of the ${app-name} application</description>
  <role-names>
  </role-names>
  <permissions>
    <permission>
      <capability>execute</capability>
      <role-name>${app-role}</role-name>
    </permission>
    <permission>
      <capability>update</capability>
      <role-name>${app-role}</role-name>
    </permission>
    <permission>
      <capability>insert</capability>
      <role-name>${app-role}</role-name>
    </permission>
    <permission>
      <capability>read</capability>
      <role-name>${app-role}</role-name>
    </permission>
  </permissions>
  <collections>
  </collections>
  <privileges>
    <privilege>
      <privilege-name>xdmp:value</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>xdmp:add-response-header</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>xdmp:invoke</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>xdmp:with-namespaces</privilege-name>
    </privilege>
  </privileges>
</role>

Моя пользовательская роль:

<role>
  <role-name>sccss-user</role-name>
  <description>sccss default role</description>
  <role-names>
    <!-- TODO test which roles we really need -->
    <!--
    <role-name>alert-user</role-name>    
    <role-name>alert-internal</role-name> 
    <role-name>rest-admin</role-name> 
    <role-name>rest-writer-internal</role-name>
    <role-name>rest-reader</role-name> 
    <role-name>network-access</role-name>
    <role-name>qconsole-user</role-name>
    -->
    <!-- cluey app role for rest api access TODO replace with dedicated api user and role 

    <role-name>${app-role}</role-name>
    -->

  </role-names>
  <permissions>
  </permissions>
  <collections>
  </collections>
  <privileges>
    <!-- HK -->
    <!--
    <privilege>
      <privilege-name>any-uri</privilege-name>
    </privilege>
    -->
    <privilege>
      <privilege-name>devices-uri</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>any-collection</privilege-name>
    </privilege>
    <!-- to make this role have acces to the REST API-->
    <privilege>
      <privilege-name>rest-reader</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>rest-writer</privilege-name>
    </privilege>
    <!-- TODO test this
    <privilege>
      <privilege-name>xdmp:value</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>xdmp:add-response-header</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>xdmp:invoke</privilege-name>
    </privilege>
    <privilege>
      <privilege-name>xdmp:with-namespaces</privilege-name>
    </privilege>
  </privileges>
  -->
</role>

Я проверил и попробовал то, что описано в блоге выше, но с этими настройками у меня нет доступа ни к какому документу, по-видимому, нет доступа к расширению остальных. Если я даю своим пользователям {app-role}, то возникает проблема с тем, что пользователи могут видеть частный контент других пользователей... потому что все пользователи имеют роль 'rest-reader'... Так что мне нужно ограничить default- роль приложения, чтобы не использовать роль rest-reader и использовать привилегии rest-reader, но не могу заставить его работать...

Одним из вариантов, который я рассматриваю, является использование document-insert() разрешения для ограниченного контента, но это должно быть возможно с правильными ролями и привилегиями, если я могу настроить его правильно, верно?

Сложение

В ответ на ответ Grtjn: thx 4 ваши комментарии, я думаю, что озадачен REST ролями. Если я посмотрю на роли по умолчанию в приложении roxy на git, то они выглядят пустыми, но когда я устанавливаю тип приложения roxy как приложение REST, все кажется более сложным. Основная путаница заключается в том, какие роли и привилегии мне нужны, чтобы вторая (независимая) роль могла использовать конечную точку REST? Для чего именно нужны и нужны привилегии xdmp:(значение,add-response-header, вызывает и т. Д.)? В моем примере, чтобы пользователь мог получить доступ к API REST, ему / ей необходимы следующие роли:

      <role-name>${app-role}</role-name>
      <!-- we need this to amp internal privileges-->
      <role-name>alert-user</role-name>    
      <role-name>alert-internal</role-name> 
      <role-name>rest-admin-internal</role-name> 

А потом мы вступаем в дискуссию, должен ли отдыхающий быть привилегией или ролью?

Итак, более конкретный вопрос:

Какой минимальный набор ролей / привилегий мне понадобится для доступа к конечной точке REST, создаваемой приложением типа отдыха roxy?

1 ответ

Я бы рекомендовал использовать следующий подход здесь:

Используйте роль приложения для выполнения приложения, а не для доступа к содержимому для начала. По этой причине удалите разрешения по умолчанию для этой роли и просто дайте ей привилегию rest-reader/rest-writer и, возможно, некоторые привилегии для запуска MLCP и тому подобное.

Затем убедитесь, что расширения REST и все остальное, что не развернуто Roxy напрямую, получат разрешение на чтение и выполнение документа. Подумайте о триггерах и оповещениях, созданных с помощью пользовательского кода, sql-представлений или схем, не загруженных схемами развертывания и т. Д. Функция change_permissions, которую мы используем в slush-marklogic-node, может служить примером того, как с этим справиться: https: // github. ком / MarkLogic / слякоть-MarkLogic-узел / тянуть / 298 / файлов # дифф-a529d1d70bd21866e1d12eda3a99f7b6R96

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

Когда у вас есть роли для чтения / записи, вы можете начать думать о том, как правильно их применять для прав доступа к документам при приеме. При таком уровне сложности вы можете избежать разрешений по умолчанию и явно выбирать разрешения для документов. Документы xdmp:document-insert, MLCP и /v1/ имеют явные разрешения для документов, поэтому вы должны иметь разумный контроль над ними.

Сложение

Обратите внимание на Roxy из коробки ml-config файл. Он не настроен должным образом для приложений типа REST. Вот почему генератор slush-marklogic-node исправляет конфигурацию ml: https://github.com/marklogic/slush-marklogic-node/blob/master/slushfile.js#L346

Минимум иметь доступ для чтения к REST API, это rest-reader priv, а иметь доступ к обновлению к REST api, это rest-writer priv. Расширения REST запускаются из базы данных модулей, а не из файловой системы, поэтому для этого вам также потребуется доступ к модулям. Упомянутая выше функция change_permissions исправит это для вас.

В любом случае, мой общий совет - использовать роль приложения для выполнения приложения, как упоминалось ранее, и другие роли для доступа к данным. Любой пользователь, который хочет использовать приложение, должен наследовать роль приложения, а также некоторые другие роли, чтобы обеспечить необходимый объем доступа к данным.

НТН!

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