Автоматизированная библиотечно-информационная система "Руслан-Нео"


Сервер


Руководство системного программиста

ООО "Открытые библиотечные системы"

Рустам Усманов

Версия 1.14.1


Аннотация

В данном документе приведены общие сведения о компонентах серверной части AБИС "Руслан-Нео" . Описаны порядок настройки и проверки компонентов, дополнительные возможности.

Глава 1. Общие сведения о программе

Серверная часть "Руслан-Нео" предназначена для обеспечения доступа удалённых пользователей к ресурсам АБИС "Руслан-Нео". Удалёнными пользователями могут являться любые пользователи сервера приложений WildFly , на базе которого функционирует АБИС. Ресурсами АБИС "Руслан-Нео" являются коллекции записей (БД) и собственно записи, поддерживаемые сервером "Руслан-Нео". Доступ к ресурсам заключается в выполнении над ними следующих операций:

  • Поиск и извлечение (по протоколам SRU 2.0 и Z39.50)

  • Извлечение, модификация, создание, удаление, блокировка, разблокировка (по протоколу WebDAV)

  • Операции, связанные с процессами книговыдачи, в т.ч. заказ услуги (бронирование, копия) по найденному библиографическому описанию (по протоколам NCIP v. 2.0.2 и 3M™ SIP v. 2.00)

Операции, связанные с чтением данных с ограниченным доступом и записью данных, требуют наличия соответствующих прав у пользователя, а следовательно и идентификации пользователя. Идентификация пользователя осуществляется при помощи провайдера идентификации по протоколу SAML 2.0.

Ресурсы хранятся в хранилище данных и представляются в двух форматах: XML и JSON, в зависимости от предпочтений пользователя.

Программы серверной части могут функционировать на любых технических средствах под управлением сервера приложений WildFly версии 10.*.

Обязательными требованиями для выполнения программ серверной части являются:

Примечание

После установки сервера WildFly необходимо убедиться в том, что установленный статический модуль PicketLink имеет версию 2.7.0.Final. При необходимости следует обновить этот модуль .

Примечание

Сведения, изложенные в этом разделе, отражены в составе статических модулей специально подготовленного дистрибутива WildFly . Этот дистрибутив, а также сервер Solr включены в конфигурацию виртуальной машины на базе дистрибутива CentOS .

Глава 2. Структура программы

Серверная часть "Руслан-Нео" состоит из следующих компонентов:

  1. jrzs-ear*.ear - Z39.50-клиент, реализованный в виде EJB.

  2. ridp*.war - провайдер идентификации.

  3. rneo.ear - Базовые сервисы "Руслан-Нео" , включая Web-интерфейс ресурсов.

  4. rneo-sip-acs-rar-*.rar - Адаптер ресурсов, поддерживающий взаимодействие по протоколу 3M™ SIP v. 2.00.

  5. rneo-ztarget-rar-*.rar - Адаптер ресурсов, поддерживающий взаимодействие по протоколу Z39.50.

Глава 3. Настройка программы

3.1. Установка программы

Установка программы заключается в развёртывании компонентов программы на сервере приложений WildFly.

Необходимым условием для развёртывания базовых сервисов является развёртывание адаптеров ресурсов.

3.2. Настройка программы

3.2.1. Настройка сервера приложений WildFly

Настройка сервера приложений может быть осуществлена посредством редактирования конфигурационного файла standalone-modeshape.xml.

Примечание

Сведения, изложенные в этом разделе, отражены в соотв. конфигурационном файле и составе статических модулей специально подготовленного дистрибутива WildFly . Его можно взять за основу и внести изменения, необходимые для настройки на конкретные условия применения (в частности, указать логины/пароли для подключения к источникам данных СУБД, LDAP).

3.2.1.1. Настройка источников данных

В конфигурацию сервера приложений WildFly требуется включить как минимум один источник данных, предназначенный для хранения ресурсов Руслан-Нео. Следует обратить внимание на то, что настройка источника данных предусматривает установку JDBC драйвера СУБД, которая будет использоваться для хранения данных. Подойдёт любая СУБД, поддерживающая транзакции.

Если планируется миграция данных из АБИС "Руслан", то потребуется установка JDBC драйвера Oracle и определение источника библиотечных данных Руслан, из которого будет осуществляться миграция данных.

Требуемые JDBC драйверы желательно устанавливать как статические модули WildFly.

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

Важно

Атрибут jta в определении источника данных должен иметь значение false.

3.2.1.2. Настройка хранилища данных

В качестве хранилища используется репозиторий контента ( JCR) ModeShape, который устанавливается в виде статического модуля WildFly. Хранилище определяется в конфигурационном файле standalone-modeshape.xml в разделе подсистемы ModeShape. Данные могут храниться как на файловой системе, так и в источниках данных СУБД. Рекомендуется использование СУБД. Пример описания репозитория, включающий определение необходимых для работы индексов, приведён в Приложении 1.

Важно

При первом запуске WilfFly определения индексов для хранилища следует закомментировать и включить их при последующих запусках WildFly.

3.2.1.3. Настройка доменов безопасности

В подсистему безопасности сервера приложений WildFly необходимо добавить два домена безопасности с именами modeshape-security и sp. Первый используется провайдером идентификации, второй - Web-интерфейсом ресурсов и другими серверными компонетами АБИС "Руслан-Нео".

Аутентификацию в домене безопасности modeshape-security необходимо настроить с использованием любого подходящего модуля входа. Именно этот домен безопасности будет использоваться при идентификации пользователей АБИС "Руслан-Нео" любых категорий. Выбор модуля входа осуществляется в зависимости от выбранного механизма хранения учётных данных пользователей. Таким образом, одним из первоочередных вопросов, требующих решения при установке АБИС "Руслан-Нео", является вопрос выбора механизма хранения учётных данных пользователей. АБИС "Руслан-Нео" обеспечивает полный цикл управления учётными данными пользователей (не только аутентификация, но и создание, удаление, модификация учётных записей) только для механизмов хранения, использующих реляционные БД или службы LDAP.

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

Аутентификацию в домене безопасности sp необходимо настроить с использованием модуля входа SAML2 (класс org.picketlink.identity.federation.bindings.wildfly.SAML2LoginModule ).

Пример результата настройки доменов безопасности, отражённого в конфигурационном файле сервера приложений WildFly, приведён в Приложении 1.

3.2.1.3.1. Роли (группы) пользователей

В АБИС "Руслан-Нео" определены следующие роли пользователей:

Таблица 3-1. Роли пользователей АБИС "Руслан-Нео"

РольОписание
ruslan-admin Администратор с наивысшими полномочиями (создание/удаление БД, миграция данных и т.д.). При создании БД, эта роль автоматически получает все полномочия по отношению к этой БД.
ruslan-circ Обычный пользователь с полномочиями по отношению к ресурсам АБИС, определяемыми списками контроля доступа для этих ресурсов. Носитель этой роли автоматически получает все полномочия по отношению к записям, отражающим запросы на бронирование от читателей.
ruslan-user Обычный пользователь с полномочиями по отношению к ресурсам АБИС, определяемыми списками контроля доступа для этих ресурсов.
admin Администратор репозитория.
readwrite Пользователь репозитория с правами записи и чтения данных.
readonly Пользователь репозитория с правом чтения данных.
connect Пользователь репозитория с правом доступа к интерфейсу WebDAV ModeShape.


Анонимный пользователь автоматически получает роль readonly.

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

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

Также для нормальной работы серверной части в используемом домене безопасности требуется наличие учётной записи системного пользователя, входящего в группы ruslan-admin, admin, readwrite и connect. При необходимости такую учётную запись следует создать. Эта учётная запись создаётся автоматически в случае отсутствия учётных записей в используемом механизме хранения.

3.2.1.4. Настройка подсистемы пакетных заданий

Для успешного восстановления пакетных заданий (например, миграция данных из АБИС "Руслан") после сбоев, подсистему пакетных заданий следует настроить таким образом, чтобы состояние выполнения пакетных заданий фиксировалось в постоянной памяти. В качестве такого механизма можно использовать источник данных СУБД, выделенный для хранилища данных или отдельный источник данных. Для этого в конфигурации подсистемы batch-jberet в standalone-modeshape.xml следует определить хранилище с именем dbb и использующим источник данных СУБД:

<subsystem xmlns="urn:jboss:domain:batch-jberet:1.0">
...
  <job-repository name="dbb">
    <jdbc data-source="neo"/>
  </job-repository>
...
</subsystem>

Следует обратить внимание на то, что JNDI-имя источника данных в этом случае приводится в краткой форме.

3.2.1.5. Настройка подсистемы очередей сообщений

В конфигурации подсистемы очередей сообщений messaging-activemq в standalone-modeshape.xml следует определить как минимум следующие очереди сообщений CreateUpdateRecordTopic, HoldExpirationTopic, WSOperationsTopic и OverdueTopic:

<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0">
  <server name="default">
    ...
    <jms-topic name="CreateUpdateRecordTopic"
      entries="java:/jms/topic/ruslan/createUpdateRecord
      java:jboss/exported/jms/topic/ruslan/createUpdateRecord"/>
    <jms-topic name="HoldExpirationTopic"
      entries="java:/jms/topic/ruslan/holdExpiration
      java:jboss/exported/jms/topic/ruslan/holdExpiration"/>
    <jms-topic name="WSOperationsTopic"
      entries="java:/jms/topic/ruslan/wsOperations
      java:jboss/exported/jms/topic/ruslan/wsOperations"/>
    <jms-topic name="OverdueTopic"
      entries="java:/jms/topic/ruslan/overdue
      java:jboss/exported/jms/topic/ruslan/overdue"/>
    ...
  </server>
</subsystem>

Следует обратить внимание на то, что JNDI-имя источника данных в этом случае приводится в краткой форме.

3.2.1.6. Настройка хранилища таймеров

В качестве хранилища данных таймеров рекомендуется использовать источник данных СУБД:

<subsystem xmlns="urn:jboss:domain:ejb3:4.0">
...
  <timer-service
    thread-pool-name="default"
    default-data-store="db-store">
    <data-stores>
      <file-data-store
        name="default-file-store"
        path="timer-service-data"
        relative-to="jboss.server.data.dir"/>
      <database-data-store
        name="db-store"
        datasource-jndi-name="java:jboss/datasources/neo"
        database="oracle"
        refresh-interval="0"/>
    </data-stores>
  </timer-service>
...
</subsystem>

3.2.2. Настройка сервера Solr

После установки сервера Solr в конфигурационный файл server/solr/configsets/data_driven_schema_configs/conf/managed-schema необходимо добавить следующие определения полей и типа полей, а также переопределить тип поля text_general:

<field name="collection" type="strings"/>
<dynamicField
  name="*_dtr"
  type="date_range"
  indexed="true"
  stored="true"/>
<fieldType
  name="date_range"
  class="solr.DateRangeField"/>
...
<fieldType
  name="text_general"
  class="solr.TextField"
  positionIncrementGap="100"
  multiValued="true">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory"
      ignoreCase="true"
      words="stopwords.txt" />
    <filter class="solr.SynonymFilterFactory"
      synonyms="synonyms.txt"
      ignoreCase="true"
      expand="false"/>
    <filter class="solr.WordDelimiterFilterFactory"
      generateWordParts="1"
      generateNumberParts="1"
      catenateWords="1"
      catenateNumbers="1"
      catenateAll="0"
      splitOnCaseChange="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory"
      ignoreCase="true"
      words="stopwords.txt" />
    <filter class="solr.SynonymFilterFactory"
      synonyms="synonyms.txt"
      ignoreCase="true"
      expand="true"/>
    <filter class="solr.WordDelimiterFilterFactory"
      generateWordParts="1"
      generateNumberParts="1"
      catenateWords="1"
      catenateNumbers="1"
      catenateAll="0"
      splitOnCaseChange="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

Если требуется нормализация индексов и запросов в соответствии с Unicode Technical Report 30, то определение поля text_general в server/solr/configsets/data_driven_schema_configs/conf/managed-schema должно выглядеть следующим образом:

<fieldType
  name="text_general"
  class="solr.TextField"
  positionIncrementGap="100"
  multiValued="true">
  <analyzer type="index">
    <tokenizer
      class="solr.WhitespaceTokenizerFactory"/>
    <filter
      class="solr.StopFilterFactory"
      ignoreCase="true"
      words="stopwords.txt" />
    <filter
      class="solr.SynonymFilterFactory"
      synonyms="synonyms.txt"
      ignoreCase="true"
      expand="false"/>
    <filter
      class="solr.WordDelimiterFilterFactory"
      generateWordParts="1"
      generateNumberParts="1"
      catenateWords="1"
      catenateNumbers="1"
      catenateAll="0"
      splitOnCaseChange="0"/>
    <filter
      class="solr.ICUFoldingFilterFactory"/>
    <filter
      class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer
      class="solr.WhitespaceTokenizerFactory"/>
    <filter
      class="solr.StopFilterFactory"
      ignoreCase="true"
      words="stopwords.txt" />
    <filter
      class="solr.SynonymFilterFactory"
      synonyms="synonyms.txt"
      ignoreCase="true"
      expand="true"/>
    <filter
      class="solr.WordDelimiterFilterFactory"
      generateWordParts="1"
      generateNumberParts="1"
      catenateWords="1"
      catenateNumbers="1"
      catenateAll="0"
      splitOnCaseChange="0"/>
    <filter
      class="solr.ICUFoldingFilterFactory"/>
    <filter
      class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

При этом в server/solr/configsets/data_driven_schema_configs/conf/solrconfig.xml следует добавить:

<lib
  dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lucene-libs/"
  regex=".*\.jar" />
<lib
  dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lib/"
  regex=".*\.jar" />
<lib
  dir="${solr.install.dir:../../../..}/dist/"
  regex="solr-analysis-extras-\d.*\.jar" />
                                    

В конфигурационном файле solr.in необходимо настроить параметры solr.autoSoftCommit.maxTime, solr.autoCommit.maxTime, -Xmx в соответствии с имеющимися вычислительными ресурсами, объёмом БД и нагрузкой. Для начала можно принять

solr.autoSoftCommit.maxTime=1000
solr.autoCommit.maxTime=10000
-Xmx2g                        
                                    

Запуск сервера необходимо осуществлять в облачном режиме.

После запуска сервера необходимо создать базовую коллекцию ruslan:

$ bin/solr create -c ruslan -d data_driven_schema_configs
                                    

3.2.3. Настройка провайдера идентификации

Настройка провайдера идентификации заключается в редактировании конфигурационного файла WEB-INF/picketlink.xml, включённого в ridp*.war. Как минимум, необходимо указать значения параметров PicketLinkIDP/IdentityURL и PicketLinkIDP/Trust/Domains, зависящие от конкретных условий эксплуатации. В первом из них необходимо указать адрес провайдера идентификации (например, https://host.domain/ridp/). Во втором - список доменов, разделённых запятой, с которыми установлены доверительные отношения (например, domain1,domain2).

3.2.4. Настройка базовых сервисов

3.2.4.1. Общая настройка

Общая настройка заключается в редактировании конфигурации подсистемы naming в standalone-modeshape.xml:

<subsystem xmlns="urn:jboss:domain:naming:2.0">
  <bindings>
    <simple
      name="java:global/ruslan/config/19013582/requestIdGeneratorName"
      value="db" type="java.lang.String"/>
    <simple
      name="java:global/ruslan/config/00000000/solrURL"
      value="localhost:9983" type="java.lang.String"/>
    <simple
      name="java:global/ruslan/config/00000000/repository"
      value="java:/jcr/neo" type="java.lang.String"/>
    <simple
      name="java:global/ruslan/config/00000000/license"
      value="file:///opt/wildfly/license.cer" type="java.net.URL"/>
    <simple
      name="java:global/ruslan/config/defaultOrgId"
      value="00000000" type="java.lang.String"/>
    <simple
      name="java:global/ruslan/config/defaultRecordSchemaName"
      value="ruslan" type="java.lang.String"/>
  </bindings>
  <remote-naming/>
</subsystem>

В таблице 3-2 представлены настраиваемые общие параметры, их JNDI-имена, примеры значений.

Таблица 3-2. Настраиваемые общие параметры базовых сервисов АБИС "Руслан-Нео"

JNDI-имяНазначениеЗначение
java:global/ruslan/config/{сигла библиотеки}/requestIdGeneratorNameИдентификатор генератора идентификаторов запросов на бронирование

db - генератор последовательных чисел

uuid - генератор уникальных идентификаторов

java:global/ruslan/config/{сигла библиотеки}/solrURLСтрока подключения к ZooKeeper (Solr)localhost:9983
java:global/ruslan/config/{сигла библиотеки}/repositoryJNDI-имя хранилищаjava:/jcr/neo
java:global/ruslan/config/{сигла библиотеки}/licenseURL лицензионного файлаfile:///opt/wildfly/license.cer
java:global/ruslan/config/defaultOrgIdСигла библиотеки по умолчанию00000000
java:global/ruslan/config/defaultRecordSchemaNameИдентификатор схемы записей по умолчаниюruslan

3.2.4.2. Настройка подсистем

Некоторые подсистемы базовых сервисов настраиваются при помощи дескриптора развёртывания приложения idx-jcr-ejb.jar/META-INF/ejb-jar.xml и иных дескрипторов, включённых в rneo*.ear.

3.2.4.2.1. Настройка параметров идентификации системного пользователя АБИС "Руслан-Нео"

В таблице 3-3 представлены настраиваемые параметры подсистемы, наименования соответствующих записей окружения, которые приводятся в дескрипторе развёртывания idx-jcr-ejb.jar/META-INF/ejb-jar.xml, примеры значений.

Таблица 3-3. Настраиваемые параметры идентификации системного пользователя АБИС "Руслан-Нео"

Наименование записи окруженияНазначениеЗначение
{сигла библиотеки}/repoLoginИдентификатор (имя входа) системного пользователя АБИС "Руслан-Нео"ruslan
{сигла библиотеки}/repoPasswordПароль системного пользователя АБИС "Руслан-Нео"changeit

3.2.4.2.2. Настройка запуска пакетных заданий по расписанию

Автоматический запуск пакетных заданий по расписанию определяется при помощи элементов timer для EJB JobScheduler в дескрипторе развёртывания idx-jcr-ejb.jar/META-INF/ejb-jar.xml:

<session>
	<ejb-name>JobScheduler</ejb-name>
	<session-type>Stateless</session-type>
	<timer>
		<schedule>
			<minute>0</minute>
			<hour>19</hour>
			<day-of-week>1-5</day-of-week>
		</schedule>
		<timeout-method>
			<method-name>timeout</method-name>
			<method-params>
				<method-param>javax.ejb.Timer</method-param>
			</method-params>
		</timeout-method>
		<info>ExportRecordsISO2709EBOOKS:19013582</info>
	</timer>
	<timer>
		<schedule>
			<minute>0</minute>
			<hour>1</hour>
			<day-of-week>6</day-of-week>
		</schedule>
		<timeout-method>
			<method-name>timeout</method-name>
			<method-params>
				<method-param>javax.ejb.Timer</method-param>
			</method-params>
		</timeout-method>
		<info>ExportRecordsISO2709BOOKS:19013582</info>
	</timer>
</session>

В элементе info указываются наименование пакетного задания и сигла библиотеки, разделённые двоеточием. Подробности настройки расписания приводятся в главе 13 спецификации JSR-345.

Соответствующие определения пакетных заданий должны быть размещены в idx-jcr-ejb.jar/META-INF/batch-jobs/, а используемые этими заданиями пакетные артефакты необходимо указать в idx-jcr-ejb.jar/META-INF/batch.xml. Пакетные задания и артефакты определяются в соответствии с требованиями спецификации JSR-352.

3.2.4.2.3. Настройка сервера Z39.50

В таблице 3-4 представлены настраиваемые параметры сервера Z39.50, которые приводятся в дескрипторе развёртывания idx-jcr-ejb.jar/META-INF/ejb-jar.xml, примеры значений.

Таблица 3-4. Настраиваемые параметры сервера Z39.50

Наименование параметраНазначениеЗначение
ServerNameСетевой адрес, по которому будет осуществляться взаимодействие с сервером Z39.500.0.0.0
PortNumberНомер порта, по которому будет осуществляться взаимодействие с сервером Z39.502100
OrgIdСигла библиотеки00000000

Фрагмент дескриптора развёртывания idx-jcr-ejb.jar/META-INF/ejb-jar.xml, связанный с настройка параметров сервера Z39.50:

<message-driven>
  <display-name>Z39.50 Target Bean</display-name>
  <ejb-name>ZTarget</ejb-name>
  <ejb-class>com.ols.ruslan.neo.z3950.server.ZTarget</ejb-class>
  <messaging-type>com.ols.z3950.server.ZMessageListener</messaging-type>
  <transaction-type>Container</transaction-type>
  <activation-config>
    <activation-config-property>
      <activation-config-property-name>ServerName</activation-config-property-name>
      <activation-config-property-value>0.0.0.0</activation-config-property-value>
    </activation-config-property>
    <activation-config-property>
      <activation-config-property-name>PortNumber</activation-config-property-name>
      <activation-config-property-value>2100</activation-config-property-value>
    </activation-config-property>
    <activation-config-property>
      <activation-config-property-name>OrgId</activation-config-property-name>
      <activation-config-property-value>00000000</activation-config-property-value>
      </activation-config-property>
  </activation-config>
  ...
</message-driven>

3.2.4.2.4. Настройка сервера 3M™ SIP v. 2.00

В таблице 3-5 представлены настраиваемые параметры сервера 3M™ SIP v. 2.00, которые приводятся в дескрипторе развёртывания idx-jcr-ejb.jar/META-INF/ejb-jar.xml, примеры значений.

Таблица 3-5. Настраиваемые параметры сервера 3M™ SIP v. 2.00

Наименование параметраНазначениеЗначение
ServerNameСетевой адрес, по которому будет осуществляться взаимодействие с сервером 3M™ SIP v. 2.000.0.0.0
PortNumberНомер порта, по которому будет осуществляться взаимодействие с сервером 3M™ SIP v. 2.0012345
OrgIdСигла библиотеки00000000

Фрагмент дескриптора развёртывания idx-jcr-ejb.jar/META-INF/ejb-jar.xml, связанный с настройка параметров сервера 3M™ SIP v. 2.00:

<message-driven>
  <display-name>SIP ACS Bean</display-name>
  <ejb-name>SIPACS</ejb-name>
  <ejb-class>com.ols.ruslan.neo.sip.server.SIPACS</ejb-class>
  <messaging-type>com.ols.sip.SIPMessageListener</messaging-type>
  <transaction-type>Container</transaction-type>
  <activation-config>
    <activation-config-property>
      <activation-config-property-name>ServerName</activation-config-property-name>
      <activation-config-property-value>0.0.0.0</activation-config-property-value>
    </activation-config-property>
    <activation-config-property>
      <activation-config-property-name>SoTimeout</activation-config-property-name>
      <activation-config-property-value>3000</activation-config-property-value>
    </activation-config-property>
    <activation-config-property>
      <activation-config-property-name>OrgId</activation-config-property-name>
      <activation-config-property-value>0000000</activation-config-property-value>
    </activation-config-property>
  </activation-config>
</message-driven>

3.2.4.2.5. Настройка параметров подсистемы управления пользователями

Подсистема управления пользователями настраивается на конкретный механизм хранения учётных данных при помощи дескриптора idx-jcr-ejb.jar/META-INF/picketlink.xml. В комплект поставки в качестве образцов включаются дескрипторы picketlink-LDAP.xml, picketlink-AD.xml и picketlink-JPA.xml, для интеграции с механизмами хранения учётных данных, использующими LDAP, Active Directory и реляционные СУБД соответственно. Необходимо перенести в picketlink.xml требуемую конфигурацию и изменить параметры в соответствии с конкретными условиями применения (адреса сервисов, идентификаторы источников данных, логины и пароли пользователей, от имени которых будет вестись работа с механизмами хранения учётных данных и т.п.).

При использовании механизма хранения учётных данных, основанного на реляционной СУБД, в дескрипторе idx-jcr-ejb.jar/META-INF/persistence.xml следует определить используемые реляционные сущности (элементы class) и источник данных (элемент non-jta-data-source). В комплект поставки входит persistence.xml с типовыми сущностями, обеспечивающими хранение учётных записей пользователей, их роли и пароли.

В состав подсистемы управления пользователями входит компонент, обеспечивающий однонаправленную синхронизацию записей на читателей из АБИС "Руслан-Нео" с используемым механизмом хранения учётных данных. Таким образом, при создании или изменении записи на читателя, например, при помощи АРМ Книговыдачи АБИС "Руслан-Нео" в механизме хранения создаются или изменяются соответствующие учётные записи. Эти записи затем могут быть использованы для аутентификации читателей в АБИС при помощи доменов безопасности, описанных выше. Эта функциональность реализуется при помощи класса idx-jcr-ejb.jar/com/ols/ruslan/neo/record/UserManager.class. Если такая синхронизация не требуется, то указанный класс следует изъять из приложения.

3.2.4.2.6. Настройка бизнес-правил

АБИС "Руслан-Нео" использует систему управления бизнес-правилами Drools в процессах обработки запросов от пользователей и событий, возникающих в системе. Бизнес-правила и вспомогательные метаданные воплощены в виде записей в БД .config-{сигла библиотеки}. Эти записи создаются автоматически при развёртывании серверной части и не обновляются при обновлении серверной части. В таблице 3-6 приведены идентификаторы поставляемых записей и их назначение.

Таблица 3-6. Бизнес-правила

Идентификатор записиНазначение
kmodule.xmlВспомогательные метаданные - описание модулей бизнес-правил
ruslan-acl-management.drlПравила управления списками контроля доступа для отдельных записей
ruslan-circulation-checkin.drlПравила возврата документов, выданных во временное пользование
ruslan-circulation-checkout.drlПравила выдачи документов во временное пользование
ruslan-circulation-renewal.drlПравила продления срока пользования документами, выданными во временное пользование
ruslan-circulation-requestItem.drlПравила бронирования документов, включая правила маршрутизации запросов на бронирование в отделы хранения
ruslan-retention-versions.drlПравила хранения версий записей

Важно

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

Редактирование бизнес-правил и вспомогательных метаданных осуществляется при помощи АРМ Администратора. Добавление новых модулей бизнес-правил осуществляется посредством их добавления в rneo.ear/idx-jcr-ejb.jar/config/. При этом название модуля с бизнес-правилами должно соответствовать названию пакета в kmodule.xml - например, ruslan-circulation-renewal.drl указывает, на то, что этот модуль относится к пакету ruslan.circulation.

3.2.5. Настройка Web-интерфейса ресурсов

3.2.5.1. Настройка провайдера услуг

Web-интерфейс ресурсов является реализацией провайдера услуг. Для успешного взаимодействия с провайдером идентификации требуется его настройка, которая заключается в редактировании конфигурационного файла WEB-INF/picketlink.xml, включённого в rneo-ear*.ear/rrs-web.war. Как минимум, необходимо указать значения параметров PicketLinkSP/IdentityURL и PicketLinkSP/ServiceURL, зависящие от конкретных условий эксплуатации. В первом из них необходимо указать адрес провайдера идентификации (например, https://host.domain/ridp/). Во втором - адрес провайдера услуг (например, https://host.domain/rrs-web/).

Глава 4. Проверка программы

Проверка развёртывания компонентов серверной части осуществляется при помощи средств управления WildFly. При неуспешном развёртывании указание на причины следует искать в журнале WildFly.

Глава 5. Дополнительные возможности

Серверная часть "Руслан-Нео" не обладает иными возможностями, помимо указанных в Главе 1.

Глава 6. Сообщения системному программисту

Сообщения системному программисту выводятся в журнал WildFly.

Перечень терминов и их определений

Модуль WildFly

Логический набор классов, предназначенный для загрузки классов и управления зависимостями в сервере приложений WildFly .

См. также Module .

Статический модуль WildFly

Модуль WildFly , установленный в каталоге modules сервера приложений WildFly .

Z39.50-клиент

Программное средство, обеспечивающее доступ одного или нескольких пользователей к удаленным или локальным ресурсам (библиографическим, полнотекстовым и др. базам данных) по протоколу Z39.50.

Перечень сокращений

EJB

Enterprise JavaBeans

JCR

Java Content Repository

JDBC

Java Database Connectivity

JNDI

Java Naming and Directory Interface

JSON

JavaScript Object Notation

LDAP

Lightweight Directory Access Protocol

NCIP

NISO Circulation Interchange Protocol

NISO

National Information Standards Organization

SAML

Security Assertion Markup Language

SIP

Standard Interchange Protocol

SRU

Search/Retrieve via URL

URL

Uniform Resource Locator

WebDAV

Web Distributed Authoring and Versioning

XML

The Extensible Markup Language

АБИС

Автоматизированная библиотечно-информационная система

БД

База данных

СУБД

Система управления базами данных

Приложение 1. Конфигурационный файл сервера приложений WildFly

1.1. Источник данных

Показано описание двух источников данных - java:jboss/datasources/lib1 и java:jboss/datasources/neo , а также драйвера oracle .

<subsystem xmlns="urn:jboss:domain:datasources:2.0">
	<datasources>
		<datasource
		    jta="false"
		    jndi-name="java:jboss/datasources/lib1"
			pool-name="lib1" enabled="true" use-ccm="false">
			<connection-url>jdbc:oracle:thin:@oracle.test.org:1521/ORA11
			</connection-url>
			<driver-class>oracle.jdbc.OracleDriver</driver-class>
			<new-connection-sql>alter session set current_schema=lib1
			</new-connection-sql>
			<driver>oracle</driver>
			<security>
				<user-name>lib1</user-name>
				<password>lib1_pwd</password>
			</security>
			<validation>
				<validate-on-match>false</validate-on-match>
				<background-validation>false</background-validation>
			</validation>
			<statement>
				<share-prepared-statements>false</share-prepared-statements>
			</statement>
		</datasource>
		<datasource
		    jta="false"
		    jndi-name="java:jboss/datasources/neo"
			pool-name="neo"
			enabled="true"
			use-ccm="false"
			statistics-enabled="true">
			<connection-url>jdbc:oracle:thin:@localhost:1521/xe</connection-url>
			<driver-class>oracle.jdbc.OracleDriver</driver-class>
			<driver>oracle</driver>
			<security>
				<user-name>neo</user-name>
				<password>changeit</password>
			</security>
			<validation>
				<validate-on-match>false</validate-on-match>
				<background-validation>false</background-validation>
			</validation>
			<statement>
				<share-prepared-statements>false</share-prepared-statements>
			</statement>
		</datasource>
		<driver name="oracle" module="com.oracle.ojdbc">
			<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource
			</xa-datasource-class>
		</driver>
	</datasources>
</subsystem>

1.2. Репозиторий

Показано описание репозитория neo, использующего для хранения как обычных, так и двоичных данных источник данных java:jboss/datasources/neo . Также показано описание необходимых для работы индексов.

<repository name="neo">
	<db-persistence create-on-start="true"
		data-source-jndi-name="java:jboss/datasources/neo" />
	<index-providers>
		<index-provider name="lucene" classname="lucene"
			module="org.modeshape.index-provider.lucene"
			relative-to="jboss.server.data.dir"
			path="modeshape/neo/indexes/" />
		<index-provider name="local" classname="local"
			relative-to="jboss.server.data.dir" path="modeshape/neo/indexes/" />
	</index-providers>
	<indexes>
		<index name="file_path" provider-name="lucene" kind="value"
			synchronous="true" node-type="nt:file" columns="jcr:path(PATH)" />
		<index name="res_path" provider-name="lucene" kind="value"
			synchronous="true" node-type="nt:resource" columns="jcr:path(PATH)" />
		<index name="file_name" provider-name="lucene" kind="value"
			synchronous="true" node-type="nt:file" columns="jcr:name(NAME)" />
		<index name="folder_name" provider-name="lucene" kind="value"
			synchronous="true" node-type="nt:folder" columns="jcr:name(NAME)" />
		<index name="rn_itemId" provider-name="lucene" kind="value"
			synchronous="true" node-type="nt:file" columns="rn:itemId(STRING)" />
		<index name="rn_userId" provider-name="lucene" kind="value"
			synchronous="true" node-type="nt:file" columns="rn:userId(STRING)" />
        <index name="rn_circ_userId" provider-name="lucene" kind="value"
            synchronous="true" node-type="nt:file" columns="rn:circUserId(STRING)"/>
	</indexes>
	<reindexing async="true" mode="if_missing" />
	<db-binary-storage data-source-jndi-name="java:jboss/datasources/neo" />
</repository>

1.3. Домены безопасности

Показано описание домена безопасности modeshape-security, использующего источник LDAP со специфичными для Active Directory настройками (идентификатор пользователя - в атрибуте sAMAccountName , идентификатор организации (сигла библиотеки) - в атрибуте company ).

Показано описание домена безопасности modeshape-security-db , использующего реляционный источник данных java:jboss/datasources/ExampleDS (идентификатор библиотеки 00000000 указывается статическим образом в параметре rolesQuery ).

Также показано описание домена безопасности sp .

<subsystem xmlns="urn:jboss:domain:security:1.2">
	<security-domains>
		<security-domain name="modeshape-security" cache-type="default">
			<authentication>
				<login-module code="LdapExtended" flag="required">
					<module-option name="password-stacking" value="useFirstPass" />
					<module-option name="java.naming.provider.url"
					               value="ldap://localhost:389" />
					<module-option name="java.naming.referral" value="follow" />
					<module-option name="bindDN" value="CN=LDAP user,CN=Users,DC=LOCAL" />
					<module-option name="bindCredential" value="changeit" />
					<module-option name="baseCtxDN" value="DC=LOCAL" />
					<module-option name="baseFilter" value="(sAMAccountName={0})" />
					<module-option name="rolesCtxDN" value="OU=ruslan,DC=LOCAL" />
					<module-option name="roleFilter" value="(member={1})" />
					<module-option name="roleAttributeID" value="cn" />
					<module-option name="roleAttributeIsDN" value="false" />
					<module-option name="roleRecursion" value="2" />
					<module-option name="searchScope" value="SUBTREE_SCOPE" />
					<module-option name="allowEmptyPasswords" value="false" />
				</login-module>
			</authentication>
			<mapping>
				<mapping-module
					code="org.jboss.security.mapping.providers.attribute.LdapAttributeMappingProvider"
					type="attribute">
					<module-option name="attributeList" value="company" />
					<module-option name="bindDN" value="CN=LDAP user,CN=Users,DC=LOCAL" />
					<module-option name="bindCredential" value="changeit" />
					<module-option name="baseFilter" value="(sAMAccountName={0})" />
					<module-option name="java.naming.provider.url"
					               value="ldap://localhost:389" />
					<module-option name="baseCtxDN" value="DC=LOCAL" />
				</mapping-module>
			</mapping>
		</security-domain>
		<security-domain name="modeshape-security-db"
			cache-type="default">
			<authentication>
				<login-module
					code="org.jboss.security.auth.spi.DatabaseServerLoginModule"
					flag="required">
					<module-option name="hashAlgorithm" value="SHA-512" />
					<module-option name="hashEncoding" value="base64" />
					<module-option name="dsJndiName"
						value="java:jboss/datasources/ExampleDS" />
					<module-option name="principalsQuery"
						value="select p.passwordencodedhash from
						passwordcredentialtypeentity p, accounttypeentity a
						where p.owner_id=a.id and a.loginname=?" />
					<module-option name="rolesQuery"
						value="select '00000000', 'Orgs' from attributetypeentity union
						select distinct r.name, 'Roles' from roletypeentity r,
						relationshipidentitytypeentity x1,
						relationshipidentitytypeentity x2,
						accounttypeentity a where r.id=x1.identitytype_id
						and x1.descriptor='role' and x2.descriptor='assignee' 
						and x1.owner_id=x2.owner_id and x2.identitytype_id=a.id
						and a.loginname=?" />
					<module-option name="digestCallback"
						value="com.ols.auth.SaltedPasswordProcessor" />
					<module-option name="saltQuery"
						value="select p.passwordsalt from passwordcredentialtypeentity p,
						accounttypeentity a where p.owner_id=a.id and a.loginname=?" />
				</login-module>
			</authentication>
		</security-domain>
		<security-domain name="sp" cache-type="default">
			<authentication>
				<login-module
					code="org.picketlink.identity.federation.bindings.wildfly.SAML2LoginModule"
					flag="required" />
			</authentication>
		</security-domain>
	</security-domains>
</subsystem>