Field Permissions
任意のエンティティタイプの特定のフィールドに対して、作成・編集・閲覧を制御するフィールドレベルの権限を設定します。
field_permissions
インストール
composer require 'drupal/field_permissions:8.x-1.4'
composer require 'drupal/field_permissions:8.x-1.3'
概要
Field Permissions モジュールを使用すると、サイト管理者は任意の種類のエンティティ(Node、ユーザー、Taxonomy Term など)に付与されたフィールドに対して、きめ細かなフィールドレベルの権限を設定できます。これにより、Drupal が提供する標準的なエンティティレベルの権限を超えた、詳細なアクセス制御が可能になります。
権限は、すべてのコンテキストでのフィールドの閲覧や編集に対して設定できるほか、現在のユーザーが所有するコンテンツのフィールドに対してのみ設定することもできます。また、エンティティ作成時のフィールド編集に対して特別な権限を設定することも可能です。
フィールド権限はデフォルトでは有効になっていません。管理者は、このレベルのアクセス制御が必要な各フィールドに対して、明示的に権限を有効にする必要があります。これにより、サイトをシンプルに保ちながら、必要に応じて高度な制御を行うことができます。
Features
- 任意のエンティティタイプ(Node、ユーザー、Taxonomy Term、コメントなど)に対するフィールドレベルのアクセス制御
- 3つの権限モード:Public(エンティティの権限を継承)、Private(作成者と管理者のみ)、Custom(完全な権限マトリックス)
- Custom 権限にはフィールドごとに5つの操作が含まれる:自分の値を作成、自分の値を編集、他者の値を編集、自分の値を閲覧、他者の値を閲覧
- すべてのフィールドの権限状態を一覧表示する集中型のフィールド権限レポート
- すべてのユーザーまたは一部のユーザーのみが特定の権限を持っているかを示す視覚的インジケーター
- 簡単な設定のためにフィールド設定フォームに直接統合された権限マトリックス
- JSON:API フィールドフィルターのアクセス制御をサポート
- カスタム権限タイプ用の拡張可能なプラグインシステム
- Drupal 7 から Drupal 8/9/10/11 へのマイグレーションサポート
- 設定可能なフィールドをサポートする任意のエンティティタイプで動作
Use Cases
プライベートなユーザープロフィールフィールド
ユーザープロフィールに、ユーザー自身(および管理者)のみが閲覧できる Private フィールドを作成します。例えば、電話番号や住所などの機密情報を保存し、ユーザーは自分のプロフィールで閲覧・編集できますが、他のユーザーのプロフィールでは閲覧できないようにします。
編集ワークフロー用フィールド
編集者と管理者のみが閲覧・編集できるフィールドをコンテンツタイプに追加します。例えば、コンテンツ作成者には表示されない「編集メモ」フィールドを作成し、編集者がコンテンツについての内部コメントを残せるようにします。
プレミアムコンテンツへのアクセス
有料購読者のみが閲覧できるプレミアムコンテンツを保存するフィールドを作成します。「subscriber」ロールにのみ「view」権限を付与し、認証済みユーザー全員が残りのコンテンツを閲覧できるようにします。
コンテンツ所有権の確認
ユーザーが自分のコンテンツの特定のフィールドのみを編集できるようにします。例えば、ユーザーは自分が作成した Node の「ステータス」フィールドを更新できますが、他のユーザーが作成したコンテンツのこのフィールドは変更できません。
スタッフ専用の連絡先情報
スタッフディレクトリで、特定の連絡先フィールド(個人の電話番号など)を Private にして、スタッフメンバーのみが自分の情報を閲覧できるようにし、公開の連絡先情報は全員に表示されるようにします。
モデレーションと品質管理
モデレーターが任意のコンテンツで編集できるが作成者には見えない、内部の品質スコアやモデレーションフラグ用のフィールドを追加します。これにより、内部プロセスをコンテンツ作成者に公開せずに、透明なモデレーションワークフローを実現できます。
Tips
- フィールド権限の設定が期待通りに動作することを確認するために、常に管理者以外のアカウントでテストしてください
- 管理 > レポート > フィールド権限 のフィールド権限レポートを使用して、すべてのフィールド権限設定の概要を素早く把握できます
- 権限設定は個々のフィールドインスタンスではなく、フィールドストレージのすべてのインスタンスに適用されることを覚えておいてください - あるバンドルで権限を変更すると、そのフィールドを使用するすべてのバンドルに影響します
- Drupal 7 からマイグレーションする場合、マイグレーション中に Field Permissions モジュールが有効になっていれば、フィールド権限設定は自動的にマイグレーションされます
- 複雑なカスタム権限を設定する代わりに、シンプルな作成者のみのアクセスには「Private」モードの使用を検討してください
- 「access private fields」権限は強力な権限です - 非常に信頼できるロールにのみ付与してください
Technical Details
Admin Pages 2
/admin/reports/fields/permissions
システム内のすべてのフィールドとその現在の権限設定を表示する包括的なレポート。各フィールドについて、フィールド名、フィールドタイプ、エンティティタイプ、使用されているバンドル、権限状態が表示されます。カスタム権限を持つフィールドでは、各権限タイプ(作成、自分を編集、他者を編集、自分を閲覧、他者を閲覧)について、すべてのユーザーがその権限を持っているかどうかを示す視覚的インジケーターが表示されます。
/admin/structure/types/manage/{bundle}/fields/{field_config}/edit
任意のフィールドの設定を編集する際、フォームの下部に「フィールドの表示と権限」セクションが追加されます(「フィールド権限の管理」権限を持つユーザーにのみ表示)。これにより、フィールドごとのアクセス制御を設定できます。注意:このセクションはコメントフィールドには表示されません。
権限 7
Hooks 4
hook_entity_field_access
適切な権限タイププラグインに委譲することでフィールドアクセス制御を実装します。設定された権限タイプに基づいてユーザーがフィールドにアクセスできない場合、AccessResult::forbidden() を返します。
hook_field_permission_type_plugin_alter
モジュールが検出されたフィールド権限タイププラグインを変更できるようにします。権限タイププラグインの削除、変更、置換に使用できます。
hook_jsonapi_entity_field_filter_access
JSON:API 経由でフィルタリングする際のフィールドへのアクセスを制御します。制限された権限を持つフィールドへの JSON:API フィルタークエリでのアクセスを防止します。
hook_migration_plugins_alter
Drupal 7 からフィールド権限設定をマイグレーションするための d7_field_permission_settings プロセスプラグインを追加します。
Troubleshooting 5
「フィールド権限の管理」権限を持っていることを確認してください。また、フィールド権限はコメントフィールドでは利用できません。
カスタム権限は、フィールドが「Custom permissions」タイプを使用するように設定された後にのみ表示されます。まずフィールドをカスタム権限を使用するように設定すると、管理 > ユーザー > 権限 に権限が表示されます。
これは設計通りです。管理者ロールは、フィールド権限を含むすべての権限を自動的に持っています。チェックボックスは無効化されてこれを示しています。
カスタム権限の場合、ロールが「Create own value for field」権限を持っていることを確認してください。Private フィールドの場合、すべてのユーザーが作成中のエンティティの Private フィールドを編集できます。
これは期待される動作です。ユーザーは閲覧権限のないフィールドでフィルタリングできません。フィルタリングを許可するには適切な閲覧権限を付与してください。
Security Notes 5
- 「administer field permissions」権限は、すべてのフィールドへのアクセスを設定できるため、信頼できる管理者にのみ付与すべきです
- 「access private fields」権限はすべての Private フィールドの制限をバイパスします - 細心の注意を払って使用してください
- フィールド権限はアクセス制御のレイヤーを追加しますが、データを暗号化しません - 機密データは必要に応じてデータベースレベルでも保護する必要があります
- カスタム権限を使用する場合、どのロールが機密フィールドにアクセスできるかを定期的に監査してください
- 完全な管理者アクセス権を持つユーザー(uid 1 または管理者としてマークされたロール)は、すべてのフィールド権限チェックをバイパスすることを覚えておいてください