ユーザーはマイドライブ フォルダを所有しています。フォルダには、さまざまなファイルにアクセスできる複数のユーザーが含まれている場合があります。この制限付きアクセス モデルでは、同じフォルダ内のアイテムのリストがユーザーによって異なる可能性があります。親のマイドライブ フォルダにはアクセスできるが、そのフォルダ内のアイテムにはアクセスできないユーザーは、「アクセスが制限されています」。階層内の誰がアクセスできるかを把握するのが難しい状況になります。
一方、共有ドライブのファイルは共有ドライブが所有しています。共有ドライブには拡張モデルがあり、すべてのユーザーが同じフォルダ内のアイテムのリストを共有します。
アクセス制限付きのフォルダ の導入により、共有ドライブの拡張アクセス モデルがマイドライブに複製されます。この変更により、アクセス制限付きのフォルダは、マイドライブと共有ドライブの両方で特定のサブフォルダへのアクセスを制限できる唯一の例外となります。
このガイドでは、Google ドライブでアクセス制限付きのフォルダと拡張アクセスを使用するフォルダを管理する方法について説明します。
アクセス制限付きのフォルダについて
アクセス制限付きのフォルダを使用すると、フォルダを特定のユーザーに制限できます。 フォルダの権限に直接追加したユーザーのみが、フォルダを開いてそのコンテンツにアクセスできます。共有マイドライブ フォルダまたは共有ドライブ フォルダへのアクセス権を継承しているユーザー(親フォルダからのアクセス)は、ドライブ内の制限付きフォルダを表示できますが、開くことはできません。この機能により、マイドライブと共有ドライブの両方でアイテムの共有動作がより適切に調整され、機密性の高いコンテンツを含むフォルダを、より広範に共有されるコンテンツとともに整理できます。
アクセス制限付きのフォルダは、マイドライブと共有ドライブの両方で使用できます。マイドライブの owner ロールと共有ドライブの organizer
ロールは、アクセス制限付きのフォルダに常にアクセスできます。フォルダ
ユーザーのリストを変更する場合、特別な権限は必要ありません。フォルダを共有できるロールは、メンバー
リストを更新できます。ロールと
権限の詳細については、ロールと権限と共有
ドライブの概要をご覧ください。
フォルダは ファイルの一種ですが、ファイルではアクセス制限を使用できません。
フォルダにアクセス制限を設定する
フォルダに対する直接的な権限を持つユーザーは、アクセス制限付きのフォルダにアクセスできますが、アクセス制限を有効または無効にできるのは、マイドライブの owner ロールと共有ドライブの organizer ロールのみです。
また、マイドライブの writer ロールを持つユーザーが
writersCanShare ブール値フィールドを files
リソースに true に設定している場合は、この機能をオンまたはオフにすることもできます。
フォルダへのアクセスを制限するには、files リソースのブール値 inheritedPermissionsDisabled フィールドを true に設定します。true の場合、アクセスできるのは owner ロール、organizer ロール、フォルダに対する直接的な権限を持つユーザーのみです。
継承された権限を再度有効にするには、inheritedPermissionsDisabled を false に設定します。
フォルダへのアクセスを制限する権限を確認する
フォルダへのアクセスを制限できるかどうかを確認するには、
capabilities.canDisableInheritedPermissions および
capabilities.canEnableInheritedPermissions フィールドのブール値を、files リソースで確認します。これらの設定により、inheritedPermissionsDisabled フィールドを使用してフォルダへのアクセスを制限する権限があるかどうかを確認できます。
capabilities の詳細については、ファイルの機能についてをご覧ください。
アクセス制限付きのフォルダの子を一覧表示する
フォルダの子を一覧表示できるかどうかを確認するには、capabilities.canListChildren ブール値フィールドを使用します。
アイテムがフォルダでない場合、またはリクエスト元のフォルダ コンテンツへのアクセス権が inheritedPermissionsDisabled を false に設定して削除された場合、返される値は常に false です。
フォルダのコンテンツへのアクセス権が削除された場合でも、
フォルダメタデータをfiles.get()と
files.list()メソッドで使用してアクセスできます。アクセスが制限されていることを確認するには、レスポンス本文で、アイテムが MIME
タイプ application/vnd.google-apps.folder のフォルダであり、
capabilities.canListChildren フィールドが false に設定されているかどうかを確認します。このようなフォルダの子を一覧表示しようとすると、結果は常に空になります。
アクセス制限付きのフォルダ メタデータにアクセスする
アクセス制限付きのフォルダを使用すると、フォルダのメタデータ を、フォルダのコンテンツにアクセスできない場合でも表示できます。
permissions リソースを使用してユーザーのアクセス権を判断する場合、メタデータへのアクセス権のみを付与するマイドライブ フォルダと共有ドライブ フォルダの両方で、レスポンス本文に inheritedPermissionsDisabled=true と view=metadata の値が含まれます。ロールは常に reader に設定されます。view フィールドは、view に属する権限に対してのみ入力されます。詳細については、ビューをご覧ください。
permissionDetails フィールドのすべてのエントリで、inherited フィールドが true に設定されています。これは、権限が継承されており、フォルダのコンテンツへの直接アクセス権が付与されていないことを示します。
フォルダのコンテンツとメタデータの両方へのアクセス権を付与するには、inheritedPermissionsDisabled フィールドを false に設定するか、ロールを reader 以上に更新します。
最後に、フォルダの継承をオフにして権限が最初に制限され(inheritedPermissionsDisabled=true)、その後、権限がフォルダに直接追加された場合、レスポンス本文の値は inheritedPermissionsDisabled=true になり、view フィールドは設定されません。フォルダが共有ドライブにある場合、permissionDetails リストには inherited フィールドが false に設定されたエントリがあり、権限が継承されていないことを示します。この権限により、他の権限と同様に、フォルダのコンテンツとメタデータの両方にアクセスできます。
アクセス制限付きのフォルダを削除する
アクセス制限付きのフォルダは、files リソースの files.delete() メソッドを使用して削除できます。
マイドライブでは、フォルダ階層を削除できるのはアイテムのオーナーのみです。 アクセス制限付きのフォルダを含む階層を、そのフォルダのオーナー以外のユーザーが削除した場合、それらのフォルダはオーナーのマイドライブに移動します。
ユーザーに owner ロールが付与されている場合、階層全体が削除されます。
共有ドライブでは、organizer ロールは、アクセス制限付きのフォルダを含む場合でも階層を削除できます。fileOrganizer ロールがアクセス制限付きのフォルダを含む階層を削除する場合、結果は、アクセス制限付きのフォルダに fileOrganizer として追加されたかどうかによって異なります。追加された場合、階層全体が削除されます。追加されていない場合、アクセス制限付きのフォルダは共有ドライブのルートフォルダに移動します。
アクセス制限のないアクセスについて
アクセス制限付きのフォルダの導入により、共有ドライブのアクセス制限のないアクセス モデルがマイドライブに拡張されます。アクセス モデルがロールアウトされると、フォルダへのアクセス権を持つことは、そのフォルダ階層内のすべてのアイテムに対する少なくとも同じレベルのアクセス権を持つことを意味します。アクセス制限付きのフォルダは、マイドライブと共有ドライブの両方で特定のサブフォルダへのアクセスを制限できる唯一の例外となります。つまり、フォルダにアクセス制限がない限り、親フォルダから継承されたアクセス権を削除することはできません。削除すると、Drive API はエラー レスポンスを返します。階層内でよりきめ細かいアクセス制御を 定義するには、フォルダにアクセス制限を 設定します。
アクセス制限のないアクセスに対応する
デベロッパーがアクセス制限のないアクセスに簡単に対応できるように、Google ドライブ API にいくつかの改善が加えられました。
permissionDetails[]フィールドに、permissionsリソースのマイドライブ内のアイテムが入力されるようになりました。以前は、フィールドが設定されていないか、必要に応じてteamDrivePermissionDetailsフィールドから複製されていました。マイドライブでは、permissionTypeフィールドとinheritedフィールドのみが入力されます。permissionDetails[].inheritedフィールドは、権限がアイテムの親から継承されているかどうかを示します。これにより、特定のロール(readerなど)が親から継承されているかどうか、およびより高いロール(writerなど)がアイテムに直接付与されているかどうかを検出できます。アイテムの権限を表示すると、
permissionDetails[]フィールドに複数のエントリが含まれることがあります。存在する場合は、そのスコープのアイテムに対する直接的な権限のエントリが 1 つと、アイテムに対する継承された権限またはメンバー権限のエントリがあります。デベロッパーは、今後強制適用される前に、マイドライブでアクセス制限のないアクセス API の動作をオプトインできます。
enforceExpansiveAccessリクエスト パラメータをtrueに設定すると、アクセス制限のないアクセスに対する今後の変更がアプリに影響しないようにできます。今すぐオプトインすると、共有ドライブ内のアイテムの場合と同様に、マイドライブ内のアイテムでも API が同じように動作します。たとえば、継承されたロールよりも低いアクセス権を制限しようとすると、
permissions.update()を呼び出すときに失敗します。 同様に、権限が継承されている場合、permissions.delete()の呼び出しは失敗します。
制限付きアクセスを検出して防止する
アプリで permissions.update() メソッドまたは permissions.delete() メソッドを使用すると、マイドライブ フォルダに制限付きアクセス(ユーザーが親のマイドライブ フォルダにはアクセスできるが、そのフォルダ内のファイルにはアクセスできない)が作成されることがあります。
これらのメソッドを使用する場合は、permissions リソースのフィールドを確認して、リクエストによって制限付きアクセスが作成される可能性がある場所を確認し、そのようなリクエストの送信を回避できます。この状況を検出するには、リクエストで enforceExpansiveAccess フィールドを使用します。
また、アプリでフォルダに制限付きアクセスがすでに作成されている場合は、次の手順を行います。
フォルダ階層をたどって、制限付きアクセスを削除します。代わりに、 フォルダのアクセス制限を設定する必要があります。
共有解除しようとしているアイテムがファイルの場合は、中間フォルダを作成し、アクセス制限を設定して、新しいフォルダにファイルを移動します。
アクセス制限付きのフォルダを使用しないが、一部のアクセス権を削除する必要がある場合は、ファイルをプライベート フォルダ(マイドライブのルートフォルダなど)に移動します。その後、アイテムの元の場所へのショートカットを作成して、 ユーザーが引き続き使用できるようにします。