保护文件内容

Google Drive API 支持多种方法来防止文件修改,包括限制文件内容以及禁止下载、打印或复制文件。

使用云端硬盘内容限制功能将文件设为只读

您可以为 Google 云端硬盘文件添加内容限制,以防止用户执行以下操作:

  • 修改标题
  • 修改内容
  • 上传修订版本
  • 添加或修改评论

应用内容限制是一种机制,可让您将云端硬盘内容设为只读,而无需更改内容的访问权限。这意味着这不是访问限制。虽然用户无法修改文件内容,但仍可根据访问权限级别执行其他操作(例如,具有修改权限的用户仍可移动内容或更改其共享设置)。

如需对云端硬盘中的文件添加或移除内容限制,用户必须拥有相关权限。对于“我的云端硬盘”或共享云端硬盘中带有 capabilities.canModifyEditorContentRestriction 的文件或文件夹,您必须已分配 role=writer。对于“我的云端硬盘”或共享云端硬盘中受 ownerRestricted 内容限制的文件或文件夹,您必须是文件的所有者或拥有 role=organizer。如需查看受内容限制的商品,用户必须使用 role=reader 或更高版本。如需查看角色的完整列表,请参阅角色和权限。如需更改文件的权限,请参阅更改权限

您可以使用 files 资源上的 contentRestrictions.readOnly 布尔值字段来设置内容限制。请注意,为内容设置内容限制会覆盖现有限制。

内容限制的场景

对云端硬盘内容施加内容限制会向用户发出信号,告知他们不应更改内容。这可能是因为以下某些原因:

  • 在审核或审核期间暂停协作文档的工作。
  • 将项设置为最终状态,例如“已批准”。
  • 防止在敏感会议期间进行更改。
  • 禁止对由自动化系统处理的工作流进行外部更改。
  • 限制 Google Apps 脚本和 Google Workspace 插件进行的修改。
  • 避免意外修改文档。

不过请注意,虽然内容限制功能有助于管理内容,但并不会阻止拥有足够权限的用户继续处理内容。此外,这也不是一种创建不可变记录的方法。云端硬盘内容限制是可变的,因此对某项内容施加内容限制并不保证该项内容永远不会发生变化。

管理受内容限制的文件

Google 文档、Google 表格和 Google 幻灯片以及所有其他文件都可能包含内容限制。

对商品施加内容限制后,系统会禁止更改其标题和内容,包括:

  • 评论和建议(针对文档、表格、幻灯片和二进制文件)
  • 二进制文件的修订版本
  • Google 文档中的文本和格式
  • Google 表格中的文本或公式、Google 表格布局以及 Google 表格中的实例
  • 幻灯片中的所有内容,以及幻灯片的顺序和数量

某些文件类型无法包含内容限制。下面是几个例子:

添加内容限制

如需添加文件内容限制,请使用 files.update 方法,并将 contentRestrictions.readOnly 字段设置为 true。添加一个可选的 reason,说明您添加限制的原因,例如“已签署合同”。以下代码示例展示了如何添加内容限制:

Java

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();

Python

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 云端硬盘界面 (UI) 中的文件名旁边会显示一个锁形符号 ()。该文件现在处于只读状态。

云端硬盘文件列表中存在内容受限的文件。
图 1. 云端硬盘文件列表中存在内容受限的文件。

移除内容限制

如需移除文件内容限制,请使用 files.update 方法,并将 contentRestrictions.readOnly 字段设置为 false。以下代码示例展示了如何移除内容限制:

Java

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

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

Python

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 字段结合使用。以下代码示例展示了如何检查内容限制的状态:

Java

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

Python

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。以下代码示例展示了如何仅为文件所有者添加内容限制:

Java

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();

Python

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

运行示例代码时,该文件会受到内容限制,只有文件所有者才能将其移除。如果您是文件所有者, 云端硬盘界面 (UI) 中文件名称旁边会显示一个处于活动状态的锁形符号 ()。如果您不是所有者,锁形符号会变暗。

如需移除 ownerRestricted 标志,请使用 files.update 方法并将 contentRestrictions.ownerRestricted 字段设置为 false

内容限制功能

files 资源包含一组布尔值 capabilities 字段,用于指示是否可以对文件执行操作。

内容限制包含以下 capabilities

  • capabilities.canModifyEditorContentRestriction:当前用户是否可以添加或修改内容限制
  • capabilities.canModifyOwnerContentRestriction:当前用户能否添加或修改所有者内容限制
  • capabilities.canRemoveContentRestriction:当前用户是否可以移除应用的内容限制(如果有)。

如需了解详情,请参阅功能

如需查看检索文件 capabilities 的示例,请参阅验证用户权限

禁止用户下载、打印或复制您的文件

您可以限制拥有 role=commenterrole=reader 权限的用户在云端硬盘、文档、表格和幻灯片中下载、打印和复制文件的方式。

如需移除下载、打印和复制文件的选项,请使用 files.update 方法,并将 copyRequiresWriterPermission 布尔值字段设置为 true