[Документация Yandex Cloud](../../index.md) > [Yandex DataLens](../index.md) > [Управление доступом](index.md) > Доступ к строкам данных

# Управление доступом на уровне строк данных (RLS)

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

{% note warning %}

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

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

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

{% endnote %}

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

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

Вы можете разграничить доступ к любому измерению датасета. Каждому [пользователю](#user-rls) или [группе пользователей](#group-rls)  могут быть выданы права на неограниченное количество значений измерений.

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

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



### Доступ для пользователей {#user-rls}

Разграничение для пользователей определяется конфигурацией доступа, которая выглядит следующим образом:

```yaml
'значение_1': пользователь_1, пользователь_2
'значение_2': пользователь_3
'значение_3': пользователь_1, пользователь_2, пользователь_3
```

Например, чтобы настроить доступ пользователя `user-login` ко всем строкам со значением `first-company` в поле `Company name`, [задайте конфигурацию](#how-to-manage-rls):

```yaml
'first-company': user-login@yandex.ru
```

{% note info %}

Если в вашей [организации](../concepts/organizations.md) настроена [федерация удостоверений](../../organization/concepts/add-federation.md), название домена может отличаться от `yandex.ru`. В этом случае укажите название своего домена.

{% endnote %}

Чтобы настроить доступ для нескольких пользователей, перечислите через запятую их аккаунты в конфигурации доступа:

```yaml
'first-company': user-login-1@yandex.ru, user-login-2@yandex.ru, user-login-3@yandex.ru
```

### Доступ для групп пользователей {#group-rls}

Разграничение для групп пользователей определяется конфигурацией доступа, которая выглядит следующим образом:

```yaml
'значение_1': @group:название_группы_1
'значение_2': @group:название_группы_1, @group:название_группы_2
```

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

Например, чтобы настроить доступ группы пользователей с именем `group-name` ко всем строкам со значением `first-company` в поле `Company name`, задайте конфигурацию:

```yaml
'first-company': @group:group-name
```

Чтобы настроить доступ для нескольких групп пользователей, перечислите их через запятую в конфигурации доступа:

```yaml
'first-company': @group:group-name-1, @group:group-name-2, @group:group-name-3
```

Можно одновременно настроить доступ для пользователей и групп:

```yaml
'first-company': user-login-1@yandex.ru, user-login-2@yandex.ru, @group:group-name-1, @group:group-name-2
```

{% note info %}

Если в вашей [организации](../concepts/organizations.md) настроена [федерация удостоверений](../../organization/concepts/add-federation.md), название домена может отличаться от `yandex.ru`. В этом случае укажите название своего домена.

{% endnote %}

### Подстановки и кавычки в конфигурации RLS {#special-}

Значения, пользователей и названия групп можно определять символом подстановки:

* Пользователям `пользователь_1`, `пользователь_2` и группе `название_группы_1` доступны все значения поля

  ```yaml
  *: пользователь_1, пользователь_2, @group:название_группы_1
  ```

  Например, чтобы настроить доступ ко всем строкам с любым значением в поле `Company name`, задайте конфигурацию:

  ```yaml
  *: user-login-1@yandex.ru, @group:group-name-1
  ```

* Значение `значение_1` доступно всем пользователям и группам

  ```yaml
  'значение_1': *
  ```

  Например, чтобы разрешить доступ для всех пользователей и групп ко всем строкам со значением `first-company` в поле `Company name`, задайте конфигурацию:

  ```yaml
  'first-company': *
  ```

Кавычки в значении задаются удвоением:

```yaml
'значение в ''кавычках''': пользователь_1, пользователь_2
```

Например, чтобы установить кавычки для названия компании `first-company "Example"` поля `Company name`, задайте конфигурацию:

```yaml
'first-company ''Example''': user-login-1@yandex.ru, @group:group-name-1
```

Также можно использовать символ `"`:

```yaml
'first-company "Example"': user-login-1@yandex.ru, @group:group-name-1
```


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

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

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

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

   
   
   Свой ID можно посмотреть [по ссылке](https://kz.center.yandex.cloud/organization/users). Если вам нужен ID другого пользователя, попросите его открыть эту ссылку и передать ID вам.



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


1. В датасете в поле с ID в настройках RLS введите `userid:userid`. Переменную `userid` можно использовать в сочетании с обычным типом RLS в датасете:

   ```yaml
   'значение_1': пользователь_1, пользователь_2
   'значение_2': пользователь_3
      userid:userid
   ```


{% note info %}

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

{% endnote %}

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

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


{% list tabs %}

- В датасете

  1. Откройте датасет.
  1. Перейдите на вкладку **Поля**.
  1. В правой части строки нажмите значок ![image](../../_assets/console-icons/ellipsis.svg) и выберите **Права доступа**.
  1. Введите значение поля и пользователей в указанном формате и нажмите **Сохранить**.

      ```yaml
      'значение_1': пользователь_1, пользователь_2
      'значение_2': пользователь_3
      ```

      Например, чтобы настроить доступ ко всем строкам со значением `first-company` в поле `Company name`:

      
      ```yaml
      'first-company': login-to-access-your-row-data@yandex.ru
      ```


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

- В источнике

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

  1. Настройте права доступа к полю:
     
     1. В датасете перейдите на вкладку **Поля**.
     1. Найдите поле с ID пользователей. В правой части строки нажмите значок ![image](../../_assets/console-icons/ellipsis.svg) и выберите **Права доступа**.
     1. В настройках прав доступа к полю допишите `userid:userid` и нажмите **Сохранить**.

  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 и добавляем `userid:userid`.

     ![image](../../_assets/datalens/security/rls-userid.png =364x187)

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

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

  {% endcut %}

{% endlist %}