Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用服务帐户创建文件时,是否可以阻止下载/打印/复制内容?_Java_Google Api_Google Drive Api_Google Oauth - Fatal编程技术网

Java 使用服务帐户创建文件时,是否可以阻止下载/打印/复制内容?

Java 使用服务帐户创建文件时,是否可以阻止下载/打印/复制内容?,java,google-api,google-drive-api,google-oauth,Java,Google Api,Google Drive Api,Google Oauth,在使用服务帐户创建文件时,我尝试使用方法setViewersCanCopyContent(false)和setWritersCanShare(false)禁用下载/打印/复制内容,但如果我在未登录谷歌帐户的浏览器中打开文件,我仍然能够执行这些功能 编辑(添加更多信息) 以下是我的工作方式:我有这个服务帐户,还有我所谓的“服务帐户所有者”,即我用来在开发者控制台>IAM中创建服务帐户的电子邮件。当我调用我的应用程序时,我的代码在服务帐户的驱动器中创建了一个文件夹,然后我将其移动到服务帐户所有者的驱

在使用服务帐户创建文件时,我尝试使用方法
setViewersCanCopyContent(false)
setWritersCanShare(false)
禁用下载/打印/复制内容,但如果我在未登录谷歌帐户的浏览器中打开文件,我仍然能够执行这些功能

编辑(添加更多信息)

以下是我的工作方式:我有这个服务帐户,还有我所谓的“服务帐户所有者”,即我用来在开发者控制台>IAM中创建服务帐户的电子邮件。当我调用我的应用程序时,我的代码在服务帐户的驱动器中创建了一个文件夹,然后我将其移动到服务帐户所有者的驱动器并将其设置为所有者(使用
setTransferOwnery(true)
)-我使用这种方法,因为正如我所注意到的,服务帐户的驱动器无法通过浏览器访问(仅通过API)

然后,当我创建一个文件时,我调用
setParents({FOLDER\u ID})
其中
FOLDER\u ID
是服务帐户所有者驱动器中文件夹的ID。然后,当我登录服务帐户所有者的驱动器并选择一个文件时,我可以看到该服务帐户是该文件的所有者,任何具有链接的人都可以查看该文件,但可以查看该文件的每个人也可以下载/打印/复制内容

以下是我正在使用的代码:

HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
final Credential credential = new GoogleCredential.Builder()                        
    .setTransport(transport)
    .setJsonFactory(jsonFactory)
    .setServiceAccountId({SERVICE_ACCOUNT_ID})
  .setServiceAccountScopesArrays.asList(DriveScopes.DRIVE_METADATA_READONLY, DriveScopes.DRIVE, DriveScopes.DRIVE_FILE, DriveScopes.DRIVE_APPDATA)
    .setServiceAccountPrivateKeyFromP12File(new File("{PATH_TO_P12_FILE}")
    .build();

Drive drive = new Drive.Builder(transport, jsonFactory, credential)
    .setHttpRequestInitializer(new HttpRequestInitializer() {
         @Override
         public void initialize(HttpRequest httpRequest) throws IOException {
             credential.initialize(httpRequest);
             httpRequest.setConnectTimeout(2 * 60000);  // 2 minutes connect timeout
             httpRequest.setReadTimeout(2 * 60000);  // 2 minutes read timeout

         }
    })
    .setApplicationName("{MY_APP}")
    .build();

File fileMetadata = new File();
fileMetadata.setName("test.doc");
fileMetadata.setMimeType("application/vnd.google-apps.document");
fileMetadata.setViewersCanCopyContent(false);
fileMetadata.setWritersCanShare(false);
fileMetadata.setParents(Arrays.asList("{SERVICE_ACCOUNT_OWNER_FOLDER_ID}"));

File file = null;

try {
    FileContent mediaContent = new FileContent("application/vnd.openxmlformats-officedocument.wordprocessingml.document", new java.io.File("{PATH_TO_FILE.doc}"));
    file = this.drive.files()
        .create(fileMetadata, mediaContent)
        .setFields("id, webViewLink")
        .execute();
} catch (IOException e) {
    e.printStackTrace();
}

Permission readPermission = new Permission();
readPermission.setType("anyone");
readPermission.setRole("reader");

drive.getDrive().permissions().create(file.getId(), readPermission)
            .execute();

是否可以使用服务帐户禁用这些功能?

我不确定我是否完全理解这里的问题

首先,服务帐户不是你的。把它想象成一个虚拟用户,它只能访问你给它的帐户。我假设您与服务帐户共享了该文件夹

现在,如果我们在验证您的服务帐户时查看您的代码,您正在使用一个范围对其进行验证,这就是访问范围

setServiceAccountScopesArrays.asList(DriveScopes.DRIVE_METADATA_READONLY, DriveScopes.DRIVE, DriveScopes.DRIVE_FILE, DriveScopes.DRIVE_APPDATA)
将所有这些添加到DriveScope中几乎是杀鸡取卵。无论如何,Drive都会给你完全的访问权限

因此,如果要防止服务帐户写入文件,则应仅使用
DriveScopes.DRIVE\u METADATA\u READONLY

我不明白的是

在我的谷歌硬盘中,当我选择创建的文件时,我可以看到我是文件的所有者,任何有链接的人都可以看到它。但每个人都可以下载/打印/复制文件内容

当您以自己的身份登录到Google drive网站时,您可以创建一个文件,服务帐户将能够看到它。但我不确定你对其他人的意思。没有人可以在Google drive中看到您未授予访问权限的个人文件。如果您与某人共享文件,则无法阻止他们下载/打印/复制该文件。这与服务帐户无关

更新

然后,当我登录服务帐户所有者的驱动器并选择一个文件时,我可以看到该服务帐户是该文件的所有者,任何具有链接的人都可以查看该文件,但可以查看该文件的每个人也可以下载/打印/复制内容


否如果你给某人一个指向该文件的链接,而他们在谷歌硬盘上查看该文件,那么就没有办法阻止他们下载/打印/处理该内容

你这样做是正确的<代码>文件元数据。setViewersCanCopyContent(false)是您应该如何防止下载的。我想知道这是不是在转让过程中丢失了


如果您希望您的文件由一个普通帐户(您的“服务帐户所有者”)拥有,那么您会发现直接在该帐户下创建文件要简单得多,而不是先在服务帐户下创建文件,然后再传输文件。它将清理您的代码,还可以避免传输过程中任何细微的副作用。

我注意到,如果我像这样更新文件(创建后):


然后它禁用下载/打印/复制。我仍然无法在创建文件时禁用它,但这种方式足以满足我的要求。

谢谢您的帮助。我将在代码中替换驱动器作用域。我对我的问题进行了编辑,以便让你明白发生了什么。当您说“如果您与某人共享一个文件,则无法阻止他们下载/打印/复制该文件”时,您的意思是当我创建一个文件并使用角色“reader”创建权限并键入“anyone”时,调用setViewersCanCopyContent(false)不会产生任何效果?请检查更新。解决服务帐户中缺少web视图的聪明方法。我看过你的更新,但我不同意“没有办法阻止他们下载/打印/处理内容”。如果我在共享对话>高级>中通过Google Drive创建一个文件,则会有一个选项“禁用供评论者和观众下载、打印和复制的选项”。如果我检查并用另一个Google帐户打开此文件,我将无法下载/打印/复制。我的问题是如何通过代码(API)来实现这一点。据我所知,这并不是我仅仅用了五年的时间。如果你不相信我,我可以尝试ping团队中的某个人进行验证。这可能是硬盘内置的功能,有很多只支持谷歌的功能。等待我的联系人做出响应,如果我们添加了功能请求,情况会更糟。我以前找过这个功能。最好的情况是它隐藏在文档中我们都没有发现的某个地方。我只转移文件夹的所有权,而不是文件的所有权,这意味着所有文件都属于我的服务帐户。我无法在“服务帐户所有者”下创建文件,因为我没有使用G套件,也无法模拟用户电子邮件。您可以使用存储的刷新令牌在服务帐户所有者上创建文件。看,是的,但这种方法超出了我的范围。其中一个要求是使用服务帐户创建文件。
File updatedFile = new  File();
updatedFile.setViewersCanCopyContent(false);
updatedFile.setWritersCanShare(false);
drive.files().update(file.getId(), updatedFile).execute();