Авторизация

Двухуровневая модель прав в DataLens

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

Первый уровень. Глобальные роли в системе

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

image

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

Второй уровень. Права доступа к объектам

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

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

Как это работает вместе?

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

Пример

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

# Поиск пользователя
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)"
# Поиск групп пользователя
        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 — это современный стандарт, используемый Keycloak, ADFS и другими IdP. Настройка проще, чем у LDAP.

{
    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)

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

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

Совет

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

Автоматическая синхронизация групп

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

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

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

Скрипты для синхронизации с внешним IdP и подробности их использования можно найти в статье Синхронизация с внешним IdP.

Кейс

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

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

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

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

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

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

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

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

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

Итоги

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