Сервис идентификации
|
Этот раздел перенесён из документации 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 |
|---|---|
|
URL LDAP-сервера, к которому необходимо подключиться. |
|
Абсолютный DN управляющего пользователя (manager user) LDAP-директории. |
|
Пароль управляющего пользователя (manager user) LDAP-директории |
|
Базовый DN: определяет корень LDAP-директории. Добавляется ко всем DN-именам, сформированным для поиска пользователей или групп.
Пример: |
|
Определяет узел в LDAP-дереве, под которым плагин должен выполнять поиск пользователей. Должен быть относительным относительно |
|
Строка LDAP-запроса, используемая при поиске пользователей. Пример: |
|
Имя свойства user id. Пример: |
|
Имя свойства имени (firstname). Пример: |
|
Имя свойства фамилии (lastname). Пример: |
|
Имя свойства email. Пример: |
|
Имя свойства пароля. Пример: |
|
Определяет узел в LDAP-дереве, под которым плагин должен выполнять поиск групп. Должен быть относительным относительно |
|
Строка LDAP-запроса, используемая при поиске групп. Пример: |
|
Имя свойства group id. Пример: |
|
Имя свойства имени группы (group Name). Пример: |
|
Имя свойства типа группы (group Type). Пример: |
|
Имя атрибута участника (member). Пример: |
|
Принимать недоверенные сертификаты, если LDAP-сервер использует SSL. Предупреждение: мы настоятельно не рекомендуем использовать это свойство. Лучше установить недоверенные сертификаты в хранилище ключей (key store) JDK. |
|
Установите в true, если LDAP-соединение использует SSL. Значение по умолчанию: |
|
Значение для свойства |
|
Значение для свойства |
|
Указывает, используются ли posix groups. Если true, коннектор будет использовать простой (неквалифицированный) user id при запросе групп по членству (group member) вместо полного DN.
Default: |
|
Разрешает анонимный вход без пароля. Значение по умолчанию: Warning: Мы настоятельно не рекомендуем использовать это свойство. Вам следует настроить LDAP на использование simple authentication без anonymous login. |
|
Если это свойство установлено в Note: Если у вас очень большое количество LDAP пользователей или групп, мы рекомендуем установить это свойство в |
|
Если это свойство установлено в Note: Поддержка упорядочивания результатов поиска реализована не в каждом LDAP-сервере. Убедитесь, что используемый вами LDAP Server реализует RFC 2891. |
|
Если задано число больше либо равно 1, включается пагинация, и результаты загружаются постранично. Поэтому запрос, отправляемый на LDAP Server, ожидает поддержку LDAPv3 Control для постраничных результатов, как определено в RFC 2696. Default: Note:
|
|
Когда попытка входа завершается неудачно с |
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-й попытки, если пользователь снова не сможет войти, пользователь будет заблокирован.
Лицензия и атрибуция
Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .
Оригинал документации: https://docs.camunda.org