今回はファイルの権限についてまとめてみました。
権限ごとにできるアクションの違いや、権限の変更方法について記載しています。
備忘録です。
ファイル権限区分とアクション
ファイルに対する権限は、大きく分けると以下の3つに分類されます。
- 所有者
- コラボレータ
- 閲覧者
それそれの権限でファイルに対して実行可能なアクションが異なります。
アクション \ 権限 | 所有者 | コラボレータ | 閲覧者 |
---|---|---|---|
参照またはプレビュー | 〇 | 〇 | 〇 |
ダウンロード | 〇 | 〇 | 〇 |
共有 | 〇 | 〇 | 〇 |
新しいバージョンをアップロード | 〇 | 〇 | |
詳細の編集 | 〇 | 〇 | |
権限の変更 | 〇 | 〇 | |
レコードから削除 | 〇 | 〇 | |
削除 | 〇 |
ファイルを削除できるのはファイルの所有者のみとなっています。
「レコードから削除」のアクションについては、ファイルは完全に削除されず、添付先のレコードから削除される、という処理になります。
ファイルに対する権限の付与・確認方法
ファイルに対する権限を確認するには、確認対象のファイルのアクションから「共有」を選択します。
下画像では、ファイルの所有者が「abo dev」で「ユーザ01」に対して「コラボレータ」権限が付与されていることが分かります。
この画面の「共有先」からユーザやグループを選択することで、ファイルに対する権限を付与することが可能です。
レコードに添付されたファイルの権限
レコードの詳細ページに「ファイル」関連リストを表示することでレコードにファイルを添付することができます。
レコードにファイルを添付するとファイルの「共有」の「アクセス権のあるユーザ」に添付先のレコードが表示されます。
そこで選択できる権限として以下の2つがあります。
- 閲覧者(デフォルト)
- レコードごとに設定
「閲覧者」権限
「共有」からファイルに対する権限を確認すると、
添付先のレコード(取引先01)に対する権限が「閲覧者」と表示されています。
これは取引先01レコードを参照できるユーザに対して「閲覧者」権限を付与しますよ、という意味です。
逆に取引先01レコードに対する参照権限がないユーザは添付ファイルにアクセスすることができません。
また、レコードにファイルを添付するとデフォルトで「閲覧者」権限が設定されます。
「レコードごとに設定」
レコードに添付されたファイルに対する権限として「レコードごとに設定」を選択することができます。
端的に説明すると、レコード権限を継承するようにファイルに対する権限を設定することができます。
具体的には次のような権限設定になります。
- レコードに対する参照・更新権限があるユーザには、添付ファイルに対する 「コラボレータ」アクセス権を付与
- レコードに対する参照権のみがあるユーザには、添付ファイルに対する 「閲覧者」アクセス権を付与
上画像の例の場合、取引先01に対して参照・更新権限をもつユーザには添付ファイルに対する「コラボレータ」権限を付与し、参照権限のみの場合は、「閲覧者」権限を付与するということです。
ライブラリに格納されたファイルの権限
ライブラリにファイルをアップロードすると「ライブラリごとに設定」というファイル権限が割り当てられます。
ファイルへのアクセス権はライブラリへのアクセス権に従うという意味です。
また、この設定を変更することはできません。
ファイル権限の変更
続いて、ファイルの権限の変更方法についてです。
今回は以下の3つの方法で更新してみました。
- 「共有」から変更
- Apexによる変更
- データローダによる変更
注意点としては、ライブラリに共有されているファイルの権限を変更することはできません。
たとえレコード、ユーザに共有されている場合でも、ライブラリへ共有されている限り権限変更不可となります。
「共有」から変更
ファイル権限変更の1つ目は「共有」から変更する方法です。
最もシンプルかつ簡単に権限変更できますが、大量のファイルの権限を一括で変更したい時には向いてない方法ですね
Apexによる変更
Apexを使用してファイル権限を変更する方法です。
ファイルが添付されているオブジェクトを指定し、一括でファイル権限を変更することができます。
処理の流れとしては以下のようになります。
- FileTypeが「メモ」でない、かつ、ライブラリに共有されていない「ContentDocument」を取得
- ①で取得したContentDocumentIdを使用して「ContentDocumentLink」を取得
- ContentDocumentLinkの「ShareType」が「V(閲覧者権限)」、かつ、Accountに添付されているファイルの場合、「ShareType」を「I(権限は関連するレコードに依存)」に更新
メモやファイル周辺のオブジェクト構成については、こちらの記事にまとめていますの良かったらご覧ください。
最終的なゴールとしては、ファイルの権限情報を保持しているContentDocumentLinkの「ShareType」の更新です。
ShareTypeの値には以下「V」、「C」、「I」があります。
下記コード例では、取引先レコードに添付されたファイル権限を「閲覧者」から「レコードごとに設定」に更新しています。
コピペで匿名実行コンソールから実行可能です。
Set<Id> idSet = new Set<Id>();
List<ContentDocumentLink> clList = new List<ContentDocumentLink>();
//FileTypeが「メモ」でない、かつ、ライブラリに共有されていない「ContentDocument」を取得
for(ContentDocument cd : [Select Id, FileType from ContentDocument Where FileType != 'SNOTE' AND ParentId = null]){
idSet.add(cd.Id);
}
//ContentDocumentIdを使用して「ContentDocumentLink」を取得
for(ContentDocumentLink cl : [Select Id, ShareType, LinkedEntityId From ContentDocumentLink Where ContentDocumentId IN: idSet]){
if(cl.ShareType == 'V' && cl.LinkedEntityId.getSobjectType() == Account.SObjectType){
/*ShareTypeが「V(閲覧者権限)」、かつ、Accountに添付されているファイルの場合、
ShareTypeを「I(権限は関連するレコードに依存)」に更新*/
ContentDocumentLink clRec = new ContentDocumentLink();
clRec.Id = cl.Id;
clRec.ShareType = 'I';
clList.add(clRec);
}
}
if(clList.size() > 0){
//ContentDocumentLink更新
update clList;
}
簡単にポイントを挙げておきます。
- 5行目:ContentDocumentには「メモ」も格納されているため、「FileType != ‘SNOTE’」で「メモ」を排除
- 5行目:ライブラリに共有されているファイルの権限は更新できないため、「ParentId = null」でライブラリに共有されているファイルを排除
- 11行目:「LinkedEntityId.getSobjectType() == Account.SObjectType」で取引先に添付されているファイルのみに更新対象を絞り込み
データローダによる変更
最後にデータローダを使用した権限の変更方法です。
オブジェクトにContentDocumentを選択し、
以下のSOQLを元にContentDocumentを取得します。
Select Id, FileType from ContentDocument Where FileType != ‘SNOTE’ AND ParentId = null
STEP1で取得したContentDocumentのIdを条件に指定し、ContentDocumentLinkを取得します。
Select Id, ShareType, LinkedEntityId From ContentDocumentLink Where ContentDocumentId = ‘0695h00000B1NtFAAV’
STEP2で取得したレコードのうち、「ShareType」が「V」のものを「I」に更新
データローダでの更新は、個人的には以下の点から少々使いにくさを感じました。
- ContentDocumentLink取得時にContentDocumentIdを指定する必要あり(数が多いと大変)
- ContentDocumentLink取得時にファイルの添付先のオブジェクトを指定できない
- ContentDocumentLink取得時にShareTypeを指定できない
一括でファイル権限を更新したい時は、2つ目に記載したApexによる更新を利用した方がよいかもしれませんね。
まとめ
今回はファイルの権限についてまとめてみました。
相変わらずファイル周辺はややこしいですね。
ファイル権限の変更については個人的には、以下のような使い分けがよさそうな印象です。
- 1件の特定のファイル権限を変更
⇒ 「共有」から変更 - 複数のファイル権限を一括変更
⇒ Apexによる変更
データローダはエクスポートを複数回する必要があったりと少し面倒なので。
今回はここまで!
コメント