Защита содержимого файла

API Google Drive поддерживает несколько способов предотвращения изменения файлов, включая ограничение содержимого файлов и запрет на загрузку, печать или копирование файлов.

Сделайте файлы доступными только для чтения с помощью ограничений содержимого Диска

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

  • Изменение названия
  • Внесение изменений в контент
  • Загрузка версии
  • Добавление или изменение комментариев

Ограничение по содержанию не является ограничением доступа. Хотя пользователи не могут изменять содержимое файла, другие операции по-прежнему разрешены в зависимости от их уровня доступа. Например, пользователь с правом редактирования может перемещать элемент или изменять настройки общего доступа к нему.

Чтобы добавить или снять ограничение на содержимое файла на Диске, пользователь должен иметь соответствующие permissions . Для файла или папки в Моем диске или на общем диске с capabilities.canModifyEditorContentRestriction необходимо назначить role=writer . Для файла или папки в Моем диске или на общем диске с ограничением содержимого ownerRestricted необходимо быть владельцем файла или иметь role=organizer . Для просмотра элемента с ограничением содержимого пользователи должны иметь role=reader или выше. Полный список ролей см. в разделе Роли и разрешения . Чтобы обновить разрешения для файла, см. раздел Обновление разрешений .

Вы можете использовать логическое поле contentRestrictions.readOnly в ресурсе files для установки ограничения по содержимому. Обратите внимание, что установка ограничения по содержимому для элемента перезаписывает существующее ограничение.

Сценарии ограничений контента

Ограничение на контент объекта на Диске сигнализирует пользователям о том, что его содержимое не следует изменять. Это может быть вызвано следующими причинами:

  • Приостановка работы над совместным документом во время периодов проверки или аудита.
  • Перевод элемента в завершенное состояние, например, одобренное.
  • Предотвращение изменений во время деликатной встречи.
  • Запрет на внесение внешних изменений в рабочие процессы, обрабатываемые автоматизированными системами.
  • Ограничение редактирования с помощью дополнений Google Apps Script и Google Workspace.
  • Предотвращение случайного редактирования документа.

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

Управление файлами с ограничениями по содержанию

Google Docs, Google Sheets и Google Slides, а также все другие файлы могут содержать ограничения по содержанию.

Ограничение на содержание элемента запрещает вносить изменения в его название и содержание, включая:

  • Комментарии и предложения (по документам, таблицам, слайдам и двоичным файлам)
  • Ревизии двоичного файла
  • Текст и форматирование в Docs
  • Текст или формулы в Таблицах, макет Таблиц и экземпляры в Таблицах
  • Весь контент в слайдах, а также порядок и количество слайдов

Некоторые типы файлов не могут содержать ограничения по содержанию. Вот несколько примеров:

Добавить ограничение на контент

Чтобы добавить ограничение по содержимому файла, используйте метод files.update , установив поле contentRestrictions.readOnly в значение true . Необязательно укажите reason добавления ограничения, например, «Договор завершен». В следующем примере кода показано, как добавить ограничение по содержимому:

Ява

File updatedFile =
  new File()
      .setContentRestrictions(
          ImmutableList.of(new ContentRestriction().setReadOnly(true).setReason("Finalized contract."));

File response = driveService.files().update("FILE_ID", updatedFile).setFields("contentRestrictions").execute();

Питон

content_restriction = {'readOnly': True, 'reason':'Finalized contract.'}

response = drive_service.files().update(fileId="FILE_ID", body = {'contentRestrictions' : [content_restriction]}, fields = "contentRestrictions").execute();

Node.js

/**
* Set a content restriction on a file.
* @return{obj} updated file
**/
async function addContentRestriction() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({scopes: 'https://www.googleapis.com/auth/drive'});
  const service = google.drive({version: 'v3', auth});
  const contentRestriction = {
    'readOnly': True,
    'reason': 'Finalized contract.',
  };
  const updatedFile = {
    'contentRestrictions': [contentRestriction],
  };
  try {
    const response = await service.files.update({
      fileId: 'FILE_ID',
      resource: updatedFile,
      fields: 'contentRestrictions',
    });
    return response;
  } catch (err) {
    // TODO (developer) - Handle error
    throw err;
  }
}

Замените FILE_ID на fileId файла, который вы хотите изменить.

При запуске примера кода доступ к файлу ограничен, и рядом с именем файла в пользовательском интерфейсе Google Диска появляется символ замка ( ). Теперь файл доступен только для чтения.

Файл с ограничением содержимого в списке файлов Диска.
Рисунок 1. Файл с ограничением содержимого в списке файлов Диска.

Снять ограничение на контент

Чтобы снять ограничение на содержимое файла, используйте метод files.update , установив поле contentRestrictions.readOnly в значение false . В следующем примере кода показано, как снять ограничение на содержимое:

Ява

File updatedFile =
new File()
    .setContentRestrictions(
        ImmutableList.of(new ContentRestriction().setReadOnly(false));

File response = driveService.files().update("FILE_ID", updatedFile).setFields("contentRestrictions").execute();

Питон

content_restriction = {'readOnly': False}

response = drive_service.files().update(fileId="FILE_ID", body = {'contentRestrictions' : [content_restriction]}, fields = "contentRestrictions").execute();

Node.js

/**
* Remove a content restriction on a file.
* @return{obj} updated file
**/
async function removeContentRestriction() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({scopes: 'https://www.googleapis.com/auth/drive'});
  const service = google.drive({version: 'v3', auth});
  const contentRestriction = {
    'readOnly': False,
  };
  const updatedFile = {
    'contentRestrictions': [contentRestriction],
  };
  try {
    const response = await service.files.update({
      fileId: 'FILE_ID',
      resource: updatedFile,
      fields: 'contentRestrictions',
    });
    return response;
  } catch (err) {
    // TODO (developer) - Handle error
    throw err;
  }
}

Замените FILE_ID на fileId файла, который вы хотите изменить.

При запуске примера кода файл больше не будет ограничен по содержимому.

Вы также можете использовать интерфейс Диска, чтобы снять ограничение на доступ к контенту и разрешить его редактирование (при наличии соответствующих разрешений). Есть два варианта:

  1. На Диске щелкните правой кнопкой мыши файл с ограничением содержимого и нажмите Разблокировать .

    Удалить ограничение на содержимое файла в списке файлов на Диске.
    Рисунок 2. Удаление ограничения на содержимое файла в списке файлов Диска.
  2. Откройте файл с ограничением по содержанию и нажмите (Заблокированный режим) > Разблокировать файл .

    Удалить ограничение на содержимое файла в документе.
    Рисунок 3. Удаление ограничения на содержимое файла в документе.

Проверьте наличие ограничений по содержанию

Чтобы проверить наличие ограничения по контенту, используйте метод files.get с возвращаемым полем contentRestrictions . В следующем примере кода показано, как проверить статус ограничения по контенту:

Ява

File response = driveService.files().get("FILE_ID").setFields("contentRestrictions").execute();

Питон

response = drive_service.files().get(fileId="FILE_ID", fields = "contentRestrictions").execute();

Node.js

/**
* Get content restrictions on a file.
* @return{obj} updated file
**/
async function fetchContentRestrictions() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({scopes: 'https://www.googleapis.com/auth/drive'});
  const service = google.drive({version: 'v3', auth});
  try {
    const response = await service.files.get({
      fileId: 'FILE_ID',
      fields: 'contentRestrictions',
    });
    return response;
  } catch (err) {
    // TODO (developer) - Handle error
    throw err;
  }
}

Замените FILE_ID на fileId файла, который вы хотите проверить.

При запуске примера кода метод возвращает ресурс ContentRestriction , если он присутствует.

Добавить ограничение на содержимое, которое может изменить только владелец файла

Чтобы добавить ограничение по содержимому файла, чтобы только владельцы файлов могли переключать этот механизм, используйте метод files.update , установив логическое поле contentRestrictions.ownerRestricted в значение true . В следующем примере кода показано, как добавить ограничение по содержимому только для владельцев файлов:

Ява

File updatedFile =
  new File()
      .setContentRestrictions(
          ImmutableList.of(new ContentRestriction().setReadOnly(true).setOwnerRestricted(true).setReason("Finalized contract."));

File response = driveService.files().update("FILE_ID", updatedFile).setFields("contentRestrictions").execute();

Питон

content_restriction = {'readOnly': True, 'ownerRestricted': True, 'reason':'Finalized contract.'}

response = drive_service.files().update(fileId="FILE_ID", body = {'contentRestrictions' : [content_restriction]}, fields = "contentRestrictions").execute();

Node.js

/**
* Set an owner restricted content restriction on a file.
* @return{obj} updated file
**/
async function addOwnerRestrictedContentRestriction() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({scopes: 'https://www.googleapis.com/auth/drive'});
  const service = google.drive({version: 'v3', auth});
  const contentRestriction = {
    'readOnly': True,
    'ownerRestricted': True,
    'reason': 'Finalized contract.',
  };
  const updatedFile = {
    'contentRestrictions': [contentRestriction],
  };
  try {
    const response = await service.files.update({
      fileId: 'FILE_ID',
      resource: updatedFile,
      fields: 'contentRestrictions',
    });
    return response;
  } catch (err) {
    // TODO (developer) - Handle error
    throw err;
  }
}

Замените FILE_ID на fileId файла, который вы хотите изменить.

При запуске примера кода доступ к файлу ограничен, и удалить его могут только владельцы. Если вы являетесь владельцем файла, рядом с его именем в пользовательском интерфейсе Диска отображается активный символ замка ( ). Если вы не являетесь владельцем, символ замка неактивен.

Чтобы снять флаг ownerRestricted , используйте метод files.update , установив поле contentRestrictions.ownerRestricted в значение false .

Возможности ограничения контента

Ресурс files содержит набор полей логических capabilities , используемых для указания возможности выполнения действия над файлом.

Ограничения по содержанию включают следующие capabilities :

Для получения дополнительной информации см. раздел Общие сведения о возможностях файлов .

Пример получения capabilities файла см. в разделе Получение возможностей файла .

Запретите пользователям загружать, печатать или копировать ваш файл

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

Чтобы определить, может ли пользователь изменять ограничения на загрузку файла, установленные владельцем или организатором, проверьте логическое поле capabilities.canChangeItemDownloadRestriction . Если значение capabilities.canChangeItemDownloadRestriction равно true , к файлу могут быть применены ограничения на загрузку. Подробнее см. в разделе «Общие сведения о возможностях файла» .

Чтобы применить ограничения на загрузку файла, установите поле downloadRestrictions с помощью метода files.update . Поле можно установить с помощью объекта DownloadRestrictionsMetadata .

Объект DownloadRestrictionsMetadata имеет два поля: itemDownloadRestriction и effectiveDownloadRestrictionWithContext . Оба поля доступны для чтения, но задать можно только itemDownloadRestriction . Поле itemDownloadRestriction возвращает объект DownloadRestriction . Объект DownloadRestriction имеет два отдельных логических поля: restrictedForReaders и restrictedForWriters .

При настройке поля itemDownloadRestriction ограничение на загрузку файла применяется непосредственно владельцем или организатором. При этом не учитываются настройки общего диска или правила защиты от потери данных (DLP). Подробнее см. в разделе «О DLP» .

Если вы обновляете поле itemDownloadRestriction , устанавливая поле restrictedForWriters в true , это подразумевает, что restrictedForReaders имеет true . Аналогично, установка restrictedForWriters в true и restrictedForReaders в false эквивалентна установке как restrictedForWriters , так и restrictedForReaders в значение true .

Для поля effectiveDownloadRestrictionWithContext ограничение загрузки применяется к файлу и учитывает все настройки ограничений и правила DLP.

Поле effectiveDownloadRestrictionWithContext может иметь значение restrictedForWriters или restrictedForReaders . Если для соответствующих ролей заданы какие-либо ограничения загрузки или копирования в настройках файлов, настройках общего диска или правилах DLP (включая правила с контекстом), то значение устанавливается равным true , в противном случае — false .

Обратная совместимость

Мы рекомендуем использовать объект DownloadRestriction , чтобы ограничить возможности пользователей загружать, печатать и копировать файлы.

Если вы хотите использовать логическое поле copyRequiresWriterPermission , функциональность будет отличаться для чтения из поля и записи в него.

Полученное значение поля copyRequiresWriterPermission определяет, могут ли пользователи с разрешением role=commenter или role=reader загружать, печатать или копировать файлы на Диске. Значение поля отражает комбинацию настроек файла, настроек общего диска и правил DLP. Однако контекстная оценка правил DLP не учитывается.

Установка поля copyRequiresWriterPermission в значение false меняет значения полей restrictedForWriters и restrictedForReaders на false . Это означает, что настройки ограничений на загрузку и копирование будут сняты для всех пользователей.

Поля, управляющие функциями загрузки, печати и копирования

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

Поле Описание Версия
capabilities.canCopy Может ли текущий пользователь копировать файл. версии 2 и 3
capabilities.canDownload Может ли текущий пользователь загрузить файл. версии 2 и 3
capabilities.canChangeCopyRequiresWriterPermission Может ли текущий пользователь изменить ограничение copyRequiresWriterPermission файла. версии 2 и 3
capabilities.canChangeItemDownloadRestriction Может ли текущий пользователь изменить ограничение на загрузку файла. только v3
copyRequiresWriterPermission Следует ли отключить возможность копирования, печати или загрузки этого файла для читателей и комментаторов. версии 2 и 3
downloadRestrictions Ограничения на загрузку файла. только v3