Сервис идентификации

Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine

Сервис идентификации (identity service) — это API-абстракция над различными репозиториями пользователей/групп. Базовые сущности:

  • User: пользователь, идентифицируемый уникальным Id

  • Group: группа, идентифицируемая уникальным Id

  • Membership: связь (relationship) между пользователями и группами

  • Tenant: тенант (tenant), идентифицируемый уникальным Id

  • Tenant Membership: связь между тенантами и пользователями/группами

Пример:

User demoUser = processEngine.getIdentityService()
  .createUserQuery()
  .userId("demo")
  .singleResult();

OpenBPM Engine различает репозитории пользователей, доступные только для чтения (read-only), и репозитории с возможностью записи (writable). Репозиторий read-only предоставляет доступ только на чтение к базовой (underlying) базе данных пользователей/групп. Репозиторий writable позволяет выполнять операции записи в базу пользователей, включая создание, обновление и удаление пользователей и групп.

Чтобы предоставить собственную реализацию identity provider, можно реализовать следующие интерфейсы:

  • {{< javadocref page="org/camunda/bpm/engine/impl/identity/ReadOnlyIdentityProvider.html" text="io.openbpm.bpm.engine.impl.identity.ReadOnlyIdentityProvider" >}}

  • {{< javadocref page="org/camunda/bpm/engine/impl/identity/WritableIdentityProvider.html" text="io.openbpm.bpm.engine.impl.identity.WritableIdentityProvider" >}}

Пользовательский whitelist для ID пользователей, групп и тенантов (Custom Whitelist for User, Group and Tenant IDs)

User, Group и Tenant IDs могут сопоставляться с Whitelist Pattern, чтобы определить, является ли переданный ID допустимым. Регулярное выражение по умолчанию (глобально), по которому выполняется сопоставление: "[a-zA-Z0-9]+|camunda-admin", то есть любая комбинация буквенно-цифровых символов или 'camunda-admin'.

Если в вашей организации разрешено использование дополнительных символов (например: спецсимволов), следует установить свойство generalResourceWhitelistPattern в ProcessEngineConfiguration, задав подходящий шаблон в конфигурационном файле движка. Можно использовать синтаксис стандартных Java Regular Expression https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html. Например, чтобы принимать любой символ, можно использовать следующее значение свойства:

<property name="generalResourceWhitelistPattern" value=".+"/>

Определить разные шаблоны для User, Group и Tenant IDs можно с помощью соответствующего свойства конфигурации:

<property name="userResourceWhitelistPattern" value="[a-zA-Z0-9-]+" />
<property name="groupResourceWhitelistPattern" value="[a-zA-Z]+" />
<property name="tenantResourceWhitelistPattern" value=".+" />

Обратите внимание: если конкретный шаблон не определён (например, whitelist pattern для tenant), будет использован общий шаблон — либо шаблон по умолчанию ("[a-zA-Z0-9]+|camunda-admin"), либо шаблон, заданный в конфигурационном файле.

Database Identity Service

Database identity service использует базу данных process engine для управления пользователями и группами. Это реализация identity service по умолчанию, которая используется, если не предоставлена альтернативная реализация identity service.

Database identity service реализует оба интерфейса ReadOnlyIdentityProvider и WritableIdentityProvider, предоставляя полную CRUD-функциональность для Users, Groups и Memberships.

LDAP Identity Service

LDAP identity service предоставляет доступ только на чтение к LDAP-репозиторию пользователей/групп. Провайдер identity service реализован как Process Engine Plugin и может быть добавлен в конфигурацию process engine. В этом случае он заменяет identity service базы данных по умолчанию.

Чтобы использовать LDAP identity service, библиотека camunda-identity-ldap.jar должна быть добавлена в classloader process engine.

{{< note title="" class="info" >}} Пожалуйста, импортируйте OpenBPM Engine BOM /get-started/apache-maven/, чтобы обеспечить корректные версии для каждого проекта OpenBPM Engine.

<dependency>
  <groupId>io.openbpm.bpm.identity</groupId>
  <artifactId>openbpm-engine-identity-ldap</artifactId>
</dependency>

Активация LDAP-плагина (Activate the LDAP Plugin)

Ниже приведён пример того, как настроить LDAP Identity Provider Plugin с использованием Spring XML:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean id="processEngineConfiguration" class="io.openbpm.bpm.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
    ...
    <property name="processEnginePlugins">
      <list>
        <ref bean="ldapIdentityProviderPlugin" />
      </list>
    </property>
  </bean>
  <bean id="ldapIdentityProviderPlugin" class="io.openbpm.bpm.identity.impl.ldap.plugin.LdapIdentityProviderPlugin">
    <property name="serverUrl" value="ldap://localhost:3433/" />
    <property name="managerDn" value="uid=daniel,ou=office-berlin,o=camunda,c=org" />
    <property name="managerPassword" value="daniel" />
    <property name="baseDn" value="o=camunda,c=org" />

    <property name="userSearchBase" value="" />
    <property name="userSearchFilter" value="(objectclass=person)" />
    <property name="userIdAttribute" value="uid" />
    <property name="userFirstnameAttribute" value="cn" />
    <property name="userLastnameAttribute" value="sn" />
    <property name="userEmailAttribute" value="mail" />
    <property name="userPasswordAttribute" value="userpassword" />

    <property name="groupSearchBase" value="" />
    <property name="groupSearchFilter" value="(objectclass=groupOfNames)" />
    <property name="groupIdAttribute" value="ou" />
    <property name="groupNameAttribute" value="cn" />
    <property name="groupMemberAttribute" value="member" />

    <property name="authorizationCheckEnabled" value="false" />
  </bean>
</beans>

Ниже приведён пример того, как настроить LDAP Identity Provider Plugin в bpm-platform.xml/processes.xml:

<process-engine name="default">
  <job-acquisition>default</job-acquisition>
  <configuration>io.openbpm.bpm.engine.impl.cfg.StandaloneProcessEngineConfiguration</configuration>
  <datasource>java:jdbc/ProcessEngine</datasource>

  <properties>...</properties>

  <plugins>
    <plugin>
      <class>io.openbpm.bpm.identity.impl.ldap.plugin.LdapIdentityProviderPlugin</class>
      <properties>

        <property name="serverUrl">ldap://localhost:4334/</property>
        <property name="managerDn">uid=jonny,ou=office-berlin,o=camunda,c=org</property>
        <property name="managerPassword">s3cr3t</property>

        <property name="baseDn">o=camunda,c=org</property>

        <property name="userSearchBase"></property>
        <property name="userSearchFilter">(objectclass=person)</property>

        <property name="userIdAttribute">uid</property>
        <property name="userFirstnameAttribute">cn</property>
        <property name="userLastnameAttribute">sn</property>
        <property name="userEmailAttribute">mail</property>
        <property name="userPasswordAttribute">userpassword</property>

        <property name="groupSearchBase"></property>
        <property name="groupSearchFilter">(objectclass=groupOfNames)</property>
        <property name="groupIdAttribute">ou</property>
        <property name="groupNameAttribute">cn</property>

        <property name="groupMemberAttribute">member</property>

        <property name="authorizationCheckEnabled">false</property>

      </properties>
    </plugin>
  </plugins>

</process-engine>

ПЛАГИН АВТОРИЗАЦИИ АДМИНИСТРАТОРА (ADMINISTRATOR AUTHORIZATION PLUGIN): LDAP Identity Provider Plugin обычно используется в сочетании с Administrator Authorization Plugin, который позволяет выдавать администраторские авторизации для конкретного LDAP-пользователя/группы.

МУЛЬТИТЕНАНТНОСТЬ (MULTI-TENANCY): В настоящее время LDPA Identity Service не поддерживает multi-tenancy. Это означает, что невозможно получать tenants из LDAP, и прозрачные ограничения доступа для multi-tenancy по умолчанию не работают.

Свойства конфигурации LDAP-плагина (Configuration Properties of the LDAP Plugin)

LDAP Identity Provider предоставляет следующие свойства конфигурации:

Property Description

serverUrl

URL LDAP-сервера, к которому необходимо подключиться.

managerDn

Абсолютный DN управляющего пользователя (manager user) LDAP-директории.

managerPassword

Пароль управляющего пользователя (manager user) LDAP-директории

baseDn

Базовый DN: определяет корень LDAP-директории. Добавляется ко всем DN-именам, сформированным для поиска пользователей или групп. Пример: o=camunda,c=org

userSearchBase

Определяет узел в LDAP-дереве, под которым плагин должен выполнять поиск пользователей. Должен быть относительным относительно baseDn. Пример: ou=employees

userSearchFilter

Строка LDAP-запроса, используемая при поиске пользователей. Пример: (objectclass=person)

userIdAttribute

Имя свойства user id. Пример: uid

userFirstnameAttribute

Имя свойства имени (firstname). Пример: cn

userLastnameAttribute

Имя свойства фамилии (lastname). Пример: sn

userEmailAttribute

Имя свойства email. Пример: mail

userPasswordAttribute

Имя свойства пароля. Пример: userpassword

groupSearchBase

Определяет узел в LDAP-дереве, под которым плагин должен выполнять поиск групп. Должен быть относительным относительно baseDn. Пример: ou=roles

groupSearchFilter

Строка LDAP-запроса, используемая при поиске групп. Пример: (objectclass=groupOfNames)

groupIdAttribute

Имя свойства group id. Пример: ou

groupNameAttribute

Имя свойства имени группы (group Name). Пример: cn

groupTypeAttribute

Имя свойства типа группы (group Type). Пример: cn

groupMemberAttribute

Имя атрибута участника (member). Пример: member

acceptUntrustedCertificates

Принимать недоверенные сертификаты, если LDAP-сервер использует SSL. Предупреждение: мы настоятельно не рекомендуем использовать это свойство. Лучше установить недоверенные сертификаты в хранилище ключей (key store) JDK.

useSsl

Установите в true, если LDAP-соединение использует SSL. Значение по умолчанию: false

initialContextFactory

Значение для свойства java.naming.factory.initial. Значение по умолчанию: com.sun.jndi.ldap.LdapCtxFactory

securityAuthentication

Значение для свойства java.naming.security.authentication. Значение по умолчанию: simple

usePosixGroups

Указывает, используются ли posix groups. Если true, коннектор будет использовать простой (неквалифицированный) user id при запросе групп по членству (group member) вместо полного DN. Default: false

allowAnonymousLogin

Разрешает анонимный вход без пароля. Значение по умолчанию: false

Warning: Мы настоятельно не рекомендуем использовать это свойство. Вам следует настроить LDAP на использование simple authentication без anonymous login.

authorizationCheckEnabled

Если это свойство установлено в true, то при запросах пользователей или групп выполняются проверки авторизаций. В противном случае проверки авторизаций при запросах пользователей или групп не выполняются. Значение по умолчанию: true

Note: Если у вас очень большое количество LDAP пользователей или групп, мы рекомендуем установить это свойство в false, чтобы улучшить производительность запросов пользователей и групп.

sortControlSupported

Если это свойство установлено в true, включается упорядочивание результатов поиска. В противном случае выражения orderBy в поисковых запросах просто игнорируются. Default: false

Note: Поддержка упорядочивания результатов поиска реализована не в каждом LDAP-сервере. Убедитесь, что используемый вами LDAP Server реализует RFC 2891.

pageSize

Если задано число больше либо равно 1, включается пагинация, и результаты загружаются постранично. Поэтому запрос, отправляемый на LDAP Server, ожидает поддержку LDAPv3 Control для постраничных результатов, как определено в RFC 2696.

Default: null (без пагинации)

Note:

  • По умолчанию некоторые реализации LDAP Server отказываются возвращать неограниченное количество результатов в одном ответе. Поэтому настройка этого свойства обязательна, чтобы обойти лимит результатов.

  • Этот параметр не влияет на UI или на количество результатов, возвращаемых через Java или REST API, поскольку там используется подход auto-pagination.

passwordCheckCatchAuthenticationException

Когда попытка входа завершается неудачно с AuthenticationException, по умолчанию плагин перехватывает это исключение и помечает проверку пароля как неуспешную. Вы можете установить этот флаг в false, что приведёт к повторному выбрасыванию (re-throw) исключения AuthenticationException плагином. Это полезно, когда вы хотите зарегистрировать frontend-плагин, который реагирует на сообщение исключения из попытки входа. Default: true

OAuth2 Identity Service

См. документацию Spring Security OAuth2 Integration: OAuth2 Identity Provider.

Ограничение частоты попыток входа (Throttle login attempts)

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

Механизм настраивается следующими свойствами и соответствующими значениями по умолчанию:

  • loginMaxAttempts=10

  • loginDelayFactor=2

  • loginDelayMaxTime=60

  • loginDelayBase=3

Дополнительную информацию см. в разделе process engine login properties.

Расчёт задержки выполняется по формуле: <code>baseTime * factor^(attempt-1)</code>. Поведение при конфигурации по умолчанию будет следующим: задержка 3 секунды после первой неуспешной попытки, 6 секунд после 2-й попытки, 12 секунд, 24 секунды, 48 секунд, 60 секунд, 60 секунд и т. д. После 10-й попытки, если пользователь снова не сможет войти, пользователь будет заблокирован.

Специфика LDAP (LDAP specifics)

Если в движке настроен LDAP, вам нужно реализовать throttling на стороне LDAP. Механизм входа в вашей системе не будет затронут свойствами, указанными выше.

Лицензия и атрибуция

Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .

Оригинал документации: https://docs.camunda.org