gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:18:41 27 4
gpt4 key购买 nike

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

编辑(添加更多信息)

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

然后,当我创建文件时,我会调用 setParents({FOLDER_ID}),其中 FOLDER_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)

添加所有这些几乎是多余的,因为 DriveScopes.Drive 无论如何都可以让您完全访问。

因此,如果您想阻止服务帐户写入文件,那么您应该只使用 DriveScopes.DRIVE_METADATA_READONLY

我不明白

In my Google Drive, when I select the created file, I can see that I am the owner of the file and anyone with the link can see it. But everyone is able to download/print/copy content of the file.

当您以自己的身份登录 Google 云端硬盘网站时,您可以创建一个文件,并且服务帐户将能够看到该文件。但我不确定你说的其他人是什么意思。任何人都无法看到您在 Google 云端硬盘中未经您授予访问权限的个人文件。如果您与某人共享文件,则无法阻止他们下载/打印/复制该文件。这与服务帐户无关。

更新:

Then, when I login service account owner's Drive and select a file, I can see that the service account is the owner of the file and anyone with the link can view file, but everyone that can view the file, can also download/print/copy content.

不,如果您向某人提供该文件的链接,并且他们在 Google 云端硬盘中查看该文件,则无法阻止他们下载/打印/复制内容

关于java - 使用服务帐户创建文件时是否可以阻止下载/打印/复制内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45963033/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com