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