---
metadata:
  - name: generator
    content: Diplodoc Platform v5.63.0
alternate:
  - en/security/row-level-security
  - ru/security/row-level-security
  - href: ru/security/row-level-security.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/security/row-level-security.html
vcsPath: ru/security/row-level-security.md
---
# Управление доступом на уровне строк данных (RLS)

RLS (_Row-level security_ — безопасность на уровне строк) позволяет ограничить доступ к данным для пользователей или [группы пользователей](../security/manage-user-groups.md) в рамках одного датасета. Например, вы можете разграничить доступ разным клиентам.

<!-- source: ru/_includes/datalens/datalens-rls-note.md -->
{% note warning %}

* При использовании RLS ограничьте доступ к подключению с помощью права доступа `Исполнение`. Это исключит возможность изменить права доступа к строкам, а также открыть окно предпросмотра данных или создать новый датасет на основе подключения.

* В RLS поддерживается разграничение доступа только для строковых значений.

* Ограничения RLS действуют на строки целиком, а не только на поля, по которым задается разграничение доступа.

{% endnote %}
<!-- endsource: ru/_includes/datalens/datalens-rls-note.md -->

Разграничить доступ к данным на уровне строк можно как в [датасете](#dataset-rls), так и в [источнике данных](#datasource-rls).

## Настройка RLS на уровне датасета {#dataset-rls}

Вы можете разграничить доступ к любому измерению датасета. Каждому пользователю или группе пользователей могут быть выданы права на неограниченное количество значений измерений.

При использовании RLS запросы к датасету проходят через следующий фильтр:

```sql
where измерение in (значение_1, значение_2 ... значение_N)
```

Вы можете настроить доступ к строкам с помощью интерфейса или задать конфигурацию в формате JSON:

{% list tabs group=instructions %}

- В интерфейсе {#interface_datalens}

  1. Откройте датасет и перейдите на вкладку **Поля**.
  1. Для поля, которому требуется настроить доступ, нажмите значок <!-- diplodoc:svg ![icon](../_assets/console-icons/key.svg) --><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 16 16"><path fill="currentColor" fill-rule="evenodd" d="M10.313 7.488 9 7.653v5.37a.5.5 0 0 1-.353.478l-1.62.498-.006.001h-.008l-.007-.006-.005-.007v-.003L7 13.979V7.653l-1.313-.165a1.5 1.5 0 0 1-1.271-1.144l-.588-2.5A1.5 1.5 0 0 1 5.288 2h5.424a1.5 1.5 0 0 1 1.46 1.844l-.588 2.5a1.5 1.5 0 0 1-1.271 1.144m2.731-.8A3 3 0 0 1 10.5 8.976v4.046a2 2 0 0 1-1.412 1.911l-1.62.499A1.52 1.52 0 0 1 5.5 13.979V8.977a3 3 0 0 1-2.544-2.29l-.588-2.5A3 3 0 0 1 5.288.5h5.424a3 3 0 0 1 2.92 3.687zM6.75 3.5a.75.75 0 0 0 0 1.5h2.5a.75.75 0 0 0 0-1.5z" clip-rule="evenodd"/></svg> или <!-- diplodoc:svg ![icon](../_assets/console-icons/ellipsis.svg) --><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 16 16"><path fill="currentColor" fill-rule="evenodd" d="M3 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3M9.5 8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0m5 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0" clip-rule="evenodd"/></svg> → **Права доступа**.
  1. В открывшемся окне на вкладке **Таблица** нажмите кнопку **Добавить правило** и укажите:

     * Кому разрешен доступ:
      
       * `Пользователи и группы` — доступ будет предоставлен указанным пользователям и группам. Можно воспользоваться поиском по имени, логину или почте пользователя.
       * `Все пользователи` — доступ будет предоставлен всем пользователям.
       * `Идентификаторы пользователей` — доступ будет разграничен [на уровне источника данных](#datasource-rls).

     * Значение поля. Доступ будет предоставлен ко всем строкам с указанным значением в поле.

     {% cut "Настройка RLS" %}
     
     ![screenshot](../_assets/datalens/security/rls-table.png)

     {% endcut %}

  1. Чтобы добавить еще одно правило, повторите предыдущий шаг.
  1. Нажмите кнопку **Сохранить**.  
  1. Сохраните датасет.

- JSON {#json}

  1. Откройте датасет и перейдите на вкладку **Поля**.
  1. Для поля, которому требуется настроить доступ, нажмите значок <!-- diplodoc:svg ![icon](../_assets/console-icons/key.svg) --><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 16 16"><path fill="currentColor" fill-rule="evenodd" d="M10.313 7.488 9 7.653v5.37a.5.5 0 0 1-.353.478l-1.62.498-.006.001h-.008l-.007-.006-.005-.007v-.003L7 13.979V7.653l-1.313-.165a1.5 1.5 0 0 1-1.271-1.144l-.588-2.5A1.5 1.5 0 0 1 5.288 2h5.424a1.5 1.5 0 0 1 1.46 1.844l-.588 2.5a1.5 1.5 0 0 1-1.271 1.144m2.731-.8A3 3 0 0 1 10.5 8.976v4.046a2 2 0 0 1-1.412 1.911l-1.62.499A1.52 1.52 0 0 1 5.5 13.979V8.977a3 3 0 0 1-2.544-2.29l-.588-2.5A3 3 0 0 1 5.288.5h5.424a3 3 0 0 1 2.92 3.687zM6.75 3.5a.75.75 0 0 0 0 1.5h2.5a.75.75 0 0 0 0-1.5z" clip-rule="evenodd"/></svg> или <!-- diplodoc:svg ![icon](../_assets/console-icons/ellipsis.svg) --><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 16 16"><path fill="currentColor" fill-rule="evenodd" d="M3 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3M9.5 8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0m5 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0" clip-rule="evenodd"/></svg> → **Права доступа**.
  1. В открывшемся окне на вкладке **JSON** задайте конфигурацию RLS в формате JSON:

     ```json
     [
       {
         "allowed_value": "sp-21",
         "pattern_type": "value",
         "subject": {
           "subject_id": "ssxiy********",
           "subject_name": "user:ssxiy********",
           "subject_type": "user"
         }
       }
     ]
     ```

     Где:

     * `allowed_value` — доступ будет предоставлен ко всем строкам с указанным значением в поле. Значение указывается, только если для `pattern_type` указано значение `value`, иначе — `null`;
     * `pattern_type` — как будет предоставлен доступ:
      
       * `value` — для определенного значения поля, указанного в поле `allowed_value`;
       * `all` — для любых значений поля. В этом случае значение `allowed_value` должно быть равно `null`;
       * `userid` — доступ будет разграничен [на уровне источника данных](#datasource-rls);

     * `subject` — описание субъекта доступа:

       * `subject_id` — идентификатор пользователя или группы, которым будет предоставлен доступ. При значении `subject_type` равном `all` указывается `*`, а равном `userid` — пустое значение;
       * `subject_name` — имя пользователя, которому будет предоставлен доступ. При значении `subject_type` равном `all` указывается `*`, а равном `userid` — значение `userid`;
       * `subject_type` — кому будет предоставлен доступ:

         * `user` — пользователю. В этом случае в `subject_id` и `subject_name` указываются идентификатор и имя пользователя соответственно;
         * `group` — группе пользователей. В этом случае в `subject_id` и `subject_name` указываются идентификатор и имя группы соответственно;
         * `all` — всем. В этом случае в `subject_id` и `subject_name` указывается `*`;
         * `userid` — доступ будет разграничен [на уровне источника данных](#datasource-rls).

     Вы можете задать несколько правил, описав каждое в объекте с указанными полями.

  1. Нажмите кнопку **Сохранить**.
  1. Сохраните датасет.

{% endlist %}

## Настройка RLS на уровне источника данных {#datasource-rls}

Настройка RLS на уровне датасета предполагает его редактирование при каждом изменении настроек RLS.

Чтобы избежать этого, можно перенести логику разграничения прав доступа на уровне строк на сторону источника данных:

1. В исходные данные добавьте новое поле для хранения ID пользователя DataLens. По этому полю будет происходить фильтрация всех запросов в источник.

   
   Свой ID можно посмотреть в параметрах [своей учетной записи](./user-account.md#see-account). Если вам нужен ID другого пользователя, попросите его посмотреть свою учетную запись и передать ID вам.


1. Для каждой строки исходных данных укажите ID пользователя DataLens, которому должна быть доступна данная строка. Если к одной строке должен быть доступ у нескольких пользователей, то логику разграничения можно вынести в отдельную таблицу и [объединить](../dataset/settings.md#multi-table) ее с основной таблицей на уровне датасета.

1. В датасете настройте доступ к полю с ID пользователей:

   {% list tabs group=instructions %}

   - В интерфейсе {#interface_datalens}

     1. В окне настроек RLS на вкладке **Таблица** нажмите кнопку **Добавить правило**.
     1. Для параметра **Кому разрешён доступ** выберите `Идентификаторы пользователей`.
     
        {% cut "Настройка RLS по идентификатору пользователя" %}
        
        ![screenshot](../_assets/datalens/security/rls-table-userid.png)

        {% endcut %}

     1. Нажмите кнопку **Сохранить**.
   
   - JSON {#json}
   
     1. В окне настроек RLS на вкладке **JSON** задайте конфигурацию RLS в формате JSON:

        ```json
        [
          {
            "allowed_value": null,
            "pattern_type": "userid",
            "subject": {
              "subject_id": "",
              "subject_name": "userid",
              "subject_type": "userid"
            },
          }
        ]
        ```

     1. Нажмите кнопку **Сохранить**. Доступ будет предоставлен пользователям с указанными в поле идентификаторами.

   {% endlist %}

1. Сохраните датасет.

{% note info %}

Перенос логики RLS на сторону источника возможен для источников, в которых доступно изменение структуры данных.

{% endnote %}

## Как изменить права доступа к строке в датасете {#how-to-manage-rls}

Чтобы настроить права доступа к строкам данных:

<!-- source: ru/_includes/datalens/operations/datalens-manage-rls-on-premises.md -->
{% list tabs %}

- В датасете

  1. Откройте датасет.
  1. Перейдите на вкладку **Поля**.
  1. В правой части строки нажмите значок <!-- diplodoc:svg ![image](../_assets/console-icons/ellipsis.svg) --><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 16 16"><path fill="currentColor" fill-rule="evenodd" d="M3 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3M9.5 8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0m5 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0" clip-rule="evenodd"/></svg> и выберите **Права доступа**.
  1. В открывшемся окне задайте права доступа к полю:

     {% list tabs group=instructions %}

     - В интерфейсе {#interface_datalens}

       1. На вкладке **Таблица** нажмите кнопку **Добавить правило** и укажите пользователей, группы или `Все пользователи` и значение поля. Например, чтобы настроить для пользователя доступ ко всем строкам со значением `first-company`:

          * **Кому разрешён доступ** — выберите пользователя.
          * **Значения поля** — введите `first-company`.

       1. Нажмите кнопку **Сохранить**.

     - JSON {#json}

       1. На вкладке **JSON** задайте конфигурацию RLS в формате JSON. Например, чтобы настроить для пользователя доступ ко всем строкам со значением `first-company`:

          ```json
          [
            {
              "allowed_value": "first-company",
              "pattern_type": "value",
              "subject": {
                "subject_id": "ssxiy********",
                "subject_name": "user:ssxiy********",
                "subject_type": "user"
              }
            }
          ]
          ```
     
       1. Нажмите кнопку **Сохранить**.

     {% endlist %}

  1. Сохраните датасет.

- В источнике

  1. Добавьте в источнике поле с ID пользователей DataLens, по которому будет осуществляться фильтрация. Вы можете добавить это поле в новую таблицу и присоединить ее с помощью оператора `JOIN`.
  1. Добавьте поле с ID пользователей в датасет:
     
     * Если вы добавили поле в существующую таблицу, в датасете перейдите на вкладку **Поля** и в верхней части экрана нажмите кнопку **Обновить поля**. Поле с ID пользователей появится в списке.
     * Если вы добавили поле в новую таблицу, присоедините ее с помощью оператора `JOIN`. Для этого в датасете перейдите на вкладку **Источники** и перетащите новую таблицу в рабочую область. Таблица автоматически свяжется с существующей. Если надо, поправьте [связь](../dataset/create-dataset.md#links) между таблицами и [удалите](../dataset/create-dataset.md#field-operations) дубликаты полей, получившиеся в результате соединения таблиц.

  1. Настройте права доступа к полю:
     
     1. В датасете перейдите на вкладку **Поля**.
     1. Найдите поле с ID пользователей. В правой части строки нажмите значок <!-- diplodoc:svg ![image](../_assets/console-icons/ellipsis.svg) --><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 16 16"><path fill="currentColor" fill-rule="evenodd" d="M3 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3M9.5 8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0m5 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0" clip-rule="evenodd"/></svg> и выберите **Права доступа**.     
     1. В открывшемся окне задайте права доступа к полю:

        {% list tabs group=instructions %}

        - В интерфейсе {#interface_datalens}

          1. В окне настроек RLS на вкладке **Таблица** нажмите кнопку **Добавить правило**.
          1. Для параметра **Кому разрешён доступ** выберите `Идентификаторы пользователей`.
          1. Нажмите кнопку **Сохранить**. Доступ будет предоставлен пользователям с идентификаторами, указанными в поле.

        - JSON {#json}

          1. В окне настроек RLS на вкладке **JSON** задайте конфигурацию RLS в формате JSON:

             ```json
             [
                {
                   "allowed_value": null,
                   "pattern_type": "userid",
                   "subject": {
                   "subject_id": "",
                   "subject_name": "userid",
                   "subject_type": "userid"
                   },
                }
             ]
             ```

          1. Нажмите кнопку **Сохранить**. Доступ будет предоставлен пользователям с идентификаторами, указанными в поле.
     
        {% endlist %}

  1. Сохраните датасет.

  {% cut "Пример" %}

  Построим дашборд по данным продаж в разрезе 4 регионов (Запад, Восток, Север, Юг). Каждый региональный менеджер должен иметь доступ только к своим данным, руководитель компании — ко всем.

  1. Определим ID для пользователей DataLens. 
  1. Создадим в источнике дополнительную таблицу `MANAGER_ID`, в которой регион соотносится с ID пользователя. Если для одного ID доступны несколько регионов, то перечислим все уникальные пары:

     | REGION | MANAGER_NAME | MANAGER_ID        |
     |--------|--------------|-------------------|
     | Запад  | Аркадий      | 19287318273912873 |
     | Восток | Василий      | 92877912837318927 |
     | Север  | Ольга        | 02993284928374346 |
     | Юг     | Дмитрий      | 10836293849237642 |
     | Запад  | Максим       | 71726123712891283 |
     | Восток | Максим       | 71726123712891283 |
     | Север  | Максим       | 71726123712891283 |
     | Юг     | Максим       | 71726123712891283 |

  1. Откроем датасет и добавим новую таблицу: на вкладке **Источники** перетащим таблицу в рабочую область.
  1. Убедимся, что связь `JOIN` установлена по полю `REGION`.

     ![image](../_assets/datalens/security/rls-join.png =403x205)

  1. По полю `MANAGER_ID` настраиваем RLS.

     {% list tabs group=instructions %}

     - В интерфейсе {#interface_datalens}

       ![image](../_assets/datalens/security/rls-userid-interface.png =465x367)

     - JSON {#json}

       ![image](../_assets/datalens/security/rls-userid-json.png =465x367)

     {% endlist %}

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

  Чтобы изменить разграничение прав доступа, обновите данные в таблице источника.

  {% endcut %}

{% endlist %}
<!-- endsource: ru/_includes/datalens/operations/datalens-manage-rls-on-premises.md -->
