---
metadata:
  - name: generator
    content: Diplodoc Platform v5.63.0
alternate:
  - en/cookbook/authorization
  - ru/cookbook/authorization
  - href: ru/cookbook/authorization.md
    type: text/markdown
    title: Markdown version
csp:
  - script-src:
      - https://mc.yandex.ru
    img-src:
      - https://mc.yandex.ru
    connect-src:
      - https://mc.yandex.ru
      - wss://mc.yandex.ru
    child-src:
      - 'blob:'
      - https://mc.yandex.ru
    frame-src:
      - 'blob:'
      - https://mc.yandex.ru
    frame-ancestors:
      - 'blob:'
      - https://mc.yandex.ru
canonical: ru/cookbook/authorization.html
title: Авторизация в DataLens On-premises
description: >-
  Из статьи вы узнаете, как устроено управление правами доступа в DataLens
  On-premises.
vcsPath: ru/cookbook/authorization.md
---

# Авторизация

## Двухуровневая модель прав в DataLens {#two-levels-role-model}

Система прав в DataLens состоит из двух уровней, которые работают вместе и определяют доступные действия для пользователя.

### Первый уровень. Глобальные роли в системе {#global-roles}

Каждому пользователю в системе назначается одна из трех глобальных ролей. Она определяет его **поведение по умолчанию** в системе. У администратора есть доступ к этим настройкам в разделе **Service settings** → **Users**.


![image](../_assets/datalens/cookbook/users-roles.png)


* **`Admin` (администратор)**. По умолчанию может все: управлять пользователями, настройками, видеть и редактировать любые объекты в системе. Требует лицензии уровня `Creator`.
* **`Creator` (создатель)**. Основная роль для аналитиков. По умолчанию может создавать подключения, датасеты и любые другие объекты в корне DataLens или там, где ему дадут права. Требует лицензии уровня `Creator`.
* **`Visitor` (читатель)**. Роль для пользователей дашбордов и отчетов. По умолчанию может **только просматривать** дашборды, к которым дали доступ. **Не может ничего создавать**. Требует лицензии уровня `Viewer`.

### Второй уровень. Права доступа к объектам {#grant-object}

Доступ к подключениям, датасетам, чартам и дашбордам настраивается на уровне воркбуков и коллекций, внутри которых хранятся эти объекты. Предоставляя доступ к воркбуку или коллекции, вы даете аналогичный доступ ко всем объектам внутри этого воркбука или коллекции — это [базовая настройка](../security/workbooks-access-basic.md) прав доступа.

[Продвинутая настройка](../security/workbooks-access-advanced.md) позволяет создавать общие объекты — подключения и датасеты, оригиналы которых можно привязывать к нескольким воркбукам, чтобы их могли использовать разные команды. При этом доступы к оригинальным объектам регулируются специальными правами.

## Как это работает вместе? {#usage-roles}

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

### Пример {#usage-example}

Если у пользователя глобальная роль `Visitor`, по умолчанию он не может ничего создавать. Представьте, что ему дают роль `Редактирование` на конкретный воркбук **Отчеты по продажам**.

**Что теперь может этот пользователь:**

* Создавать и редактировать дашборды и чарты внутри воркбука **Отчеты по продажам**.
* Просматривать другие доступные объекты в системе.

**Что НЕ может пользователь:**

* Создать новый воркбук **Мои отчеты**, так как его глобальная роль `Visitor` запрещает создание объектов на верхнем уровне.
* Создать новое подключение к базе данных, так как это глобальное действие, требующее глобальной роли `Creator` или `Admin`.

Эта модель позволяет гибко управлять доступом: давать пользователям права на создание контента только в их песочницах без засорения глобального пространства и выдачи лишних прав доступа.

## Настройка провайдеров аутентификации {#auth-providers-config}

Интеграция с внешними системами настраивается через JSON-файл, который передается в `./init.sh` с помощью флага `--auth-providers-config`.

```shell
./init.sh --auth-providers-config ./my-auth-providers.json
```

Структуру этого файла можно посмотреть в примере `./help/auth-provider-config.example.json`.

### Интеграция с LDAP на примере Active Directory {#ldap}

Рассмотрите самый частый сценарий для корпоративных сред.

В JSON-файле нужно описать, как DataLens должен находить и аутентифицировать пользователей в LDAP-каталоге.

**Пример фрагмента конфигурации:**

```json
const adConfig = {
            slug: 'active-directory',
            title: 'Active Directory',
            type: 'ldap',
            defaultRole: 'datalens.visitor',
            config: {
                url: 'ldap://ad.example.com:389',
                bindDN: 'CN=Service Account,OU=Service Accounts,DC=example,DC=com',
                bindCredentials: 'service_account_password',
                searchBase: 'OU=Users,DC=example,DC=com',
                searchFilter: '(&(objectClass=user)(sAMAccountName={{username}}))',
                groupSearchBase: 'OU=Groups,DC=example,DC=com',
                groupSearchFilter: '(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={{dn}}))',
                groupDnProperty: 'dn',
                searchScope: 'sub',
                groupSearchScope: 'sub',
        
                userAttributes: {
                    userId: 'sAMAccountName',
                    login: 'sAMAccountName',
                    email: 'mail',
                    firstName: 'givenName',
                    lastName: 'sn',
                },
        
                groupAttributes: {
                    groupId: 'dn',
                    title: 'cn',
                },
        
                roleToGroupId: {
                    'datalens.admin': 'CN=DatalensAdmins,OU=Groups,DC=example,DC=com',
                    'datalens.creator': 'CN=DatalensCreators,OU=Groups,DC=example,DC=com',
                },
        
                syncUserRoles: true,
                syncUserGroups: true,
            },
        };
```

**Отладка с `ldapsearch`**

Прежде чем применять конфигурацию, проверьте ее параметры с помощью утилиты `ldapsearch`, используя свои значения `host`, `cn`, `dc`, `ou`.

```shell
# Поиск пользователя
ldapsearch \
          -H ldap://ldap.example.com:389 \
          -x \
          -D cn=admin,dc=example,dc=org \
          -w admin \
          -b ou=users,dc=example,dc=org \
          "(uid=bob)"
```

```shell
# Поиск групп пользователя
        ldapsearch \
          -H ldap://ldap.example.com:389 \
          -x \
          -D cn=admin,dc=example,dc=org \
          -w admin \
          -b ou=groups,dc=example,dc=org \
          "(&(objectClass=groupOfNames)(member=uid=bob,ou=users,dc=example,dc=org))"
```

Если команды возвращают данные — ваши параметры верны, можно применять конфигурацию.

### Интеграция по протоколу OpenID Connect (OIDC) {#oidc}

OIDC — это современный стандарт, используемый Keycloak, ADFS и другими IdP. Настройка проще, чем у LDAP.

```json
{
    slug: 'keycloak',                  // Уникальный идентификатор провайдера
    title: 'Keycloak',                 // Отображаемое название провайдера
    type: 'oidc',                      // Тип провайдера (должен быть 'oidc')
    defaultRole: 'datalens.visitor',   // Роль по умолчанию для новых пользователей
    config: {
        // Параметры подключения к OIDC-серверу
        issuer: 'https://keycloak.example.org/realms/datalens-enterprise/.well-known/openid-configuration',  // URL OIDC-сервера
        clientId: 'datalens',          // Идентификатор клиента
        clientSecret: 'password',      // Секрет клиента
        codeChallengeMethod: 'S256',   // Метод PKCE (Proof Key for Code Exchange)
        scope: ['openid', 'profile', 'email', 'roles', 'groups'],  // Запрашиваемые области доступа
        
        // Маппинг атрибутов пользователя (опционально)
        userAttributes: {
            userId: 'sub',             // Атрибут для идентификатора пользователя (по умолчанию 'sub')
            login: 'preferred_username', // Атрибут для логина пользователя (по умолчанию 'preferred_username')
            email: 'email',            // Атрибут для адреса электронной почты пользователя (по умолчанию 'email')
            firstName: 'given_name',   // Атрибут для имени пользователя (по умолчанию 'given_name')
            lastName: 'family_name',   // Атрибут для фамилии пользователя (по умолчанию 'family_name')
        },
        
        // Настройка ролей (опционально)
        roles: {
            path: 'resource_access.datalens.roles',  // Путь к ролям в userinfo
            targetType: 'array-of-strings',          // Тип данных ролей
            mapping: {
                'datalens.admin': 'client.datalens.admin',     // Маппинг ролей
                'datalens.creator': 'client.datalens.creator', // Маппинг ролей
                'datalens.visitor': 'client.datalens.visitor', // Маппинг ролей
            },
        },
        syncUserRoles: true,           // Синхронизировать роли пользователя при каждом входе
        
        // Настройка групп (опционально)
        groups: {
            path: 'groups',            // Путь к группам в userinfo
            targetType: 'array-of-objects',  // Тип данных групп
            mapping: {                 // Маппинг атрибутов группы (только для 'array-of-objects')
                groupId: 'id',         // Атрибут для идентификатора группы
                title: 'name',         // Атрибут для названия группы
            },
        },
        syncUserGroups: true,          // Синхронизировать группы пользователя при каждом входе
    }
}

```

`issuer` — это базовый URL вашего OIDC-провайдера, откуда DataLens сможет автоматически получить всю информацию: адреса эндпоинтов авторизации, токенов и так далее.

## Важность `UI_APP_ENDPOINT` (`ingress.domain`) {#ui-app-endpoint}

При использовании OIDC или SAML ваш провайдер аутентификации должен знать, куда перенаправить пользователя после успешного входа. Этот адрес и есть публичный URL вашего DataLens. Система берет его из параметра `ingress.domain` в `values.yaml`.

Если `ingress.domain` не совпадает с реальным адресом, по которому пользователи заходят на DataLens, авторизация не будет работать — ошибка `redirect_uri_mismatch`.

{% note tip %}

Рекомендуется чистить куки при изменении домена, на котором развернут DataLens.

{% endnote %}

## Автоматическая синхронизация групп {#group-synchronization}

Вы можете настроить DataLens так, чтобы он автоматически добавлял пользователя в определенные группы на основе его атрибутов в системе LDAP. Это можно реализовать с помощью скрипта `idp-sync.js`, который есть в директории **help**.

Это позволяет централизованно управлять правами доступа через группы Active Directory, а не назначать права каждому пользователю в DataLens вручную.

Для более сложных сценариев используется отдельный Node.js-скрипт, который работает с API DataLens. Это продвинутый уровень, выходящий за рамки базовой настройки.

Скрипты для синхронизации с внешним IdP и подробности их использования можно найти в статье [Синхронизация с внешним IdP](../concepts/auth-providers/sync-IdP.md).

## Кейс {#case-example}

Пользователю назначена глобальная роль `Visitor`. Ему дали роль `Редактирование` на воркбук **Маркетинг**. Какие действия он сможет выполнить? Выберите два верных ответа:

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

{% cut "Узнать ответ" %}

* Создать новый дашборд в воркбуке **Маркетинг**

    Верно. Роль `Редактирование` на воркбук позволяет создавать и редактировать объекты внутри него, расширяя глобальную роль `Visitor`.

* Создать новое подключение к базе данных

    Неверно. Создание подключений — это глобальное действие, которое требует глобальной роли `Creator` или `Admin`. Его глобальная роль `Visitor` это запрещает, а права на воркбук здесь не действуют.

* Создать новый воркбук **Мои личные отчеты**

    Неверно. Его глобальная роль `Visitor` запрещает создание объектов на верхнем уровне. Роль `Редактирование` действует только внутри воркбука **Маркетинг**.

* Просматривать дашборды в воркбуке **Продажи** при наличии доступа на просмотр

    Верно. Его основная глобальная роль — `Visitor`, поэтому он может смотреть все, к чему ему открыт доступ.

{% endcut %}

## Итоги {#results}

Вы освоили ответственную задачу администратора — настройку авторизации. Теперь вы можете подключить DataLens к корпоративному каталогу пользователей, понимаете разницу между ролями и знаете, где искать проблему.
