Permissions by Term
特定のタクソノミータームに割り当てられたユーザーアカウントやユーザーロールに基づいて、ノードおよびタクソノミータームへのアクセスを制限します。
permissions_by_term
インストール
composer require 'drupal/permissions_by_term:^3.1'
概要
Permissions by Termモジュールは、タクソノミータームを通じて個々のノードへのアクセスを制限する機能を提供することで、Drupalを拡張します。タクソノミータームの権限は、特定のユーザーアカウントやユーザーロールに紐付けることができます。これにより、サイト管理者はDrupalのコアタクソノミー機能を使用して、ウェブサイト上にアクセス制限付きのコンテンツエリアを構築できます。
Permissions by TermはDrupalのNode Access Recordsシステムを使用するため、ノードアクセスに依存する他のすべてのコアシステム(検索結果、メニュー、Views、直接ノードアクセスなど)がこれらの制限を尊重します。
このモジュールは、Drupalのコア機能であるタクソノミータームに基づいて、指定されたDrupalノードへのユーザーアクセスを制限する軽量なアクセス制御ソリューションを提供します。これにより、最小限のcontribコードに依存しながらコンテンツアクセスを制限できます。
Features
- ユーザーまたはロールに割り当てられたタクソノミーターム権限に基づいてノードへのアクセスを制限
- ユーザー固有およびロールベースの両方のターム権限をサポート
- 多言語サポート - 権限は言語を認識し、言語ごとに保存される
- DrupalのNode Access Recordsシステムと統合し、検索、メニュー、Viewsで一貫したアクセス制御を実現
- 権限モード、ボキャブラリー制限、表示オプションを設定するための設定フォーム
- ノード編集フォームに許可されたユーザーとロールを表示する権限情報を表示
- 管理者がユーザーに直接ターム権限を割り当てられるユーザーフォーム統合
- ユーザー権限に基づく自動タームオートコンプリートフィルタリング
- ノードアクセス権限を再構築するためのDrushコマンド
- ターム権限をインポートするためのMigrationプラグインサポート
- アクセス拒否シナリオに対応するためのイベントシステム
- アクセス結果キャッシングによる最適化されたパフォーマンスのためのキャッシュシステム
- サブモジュール(Permissions by Entity)がノード以外のエンティティに機能を拡張
Use Cases
プレミアムコンテンツを持つ会員制サイト
「会員アクセス」ボキャブラリーを作成し、「無料」「プレミアム」「VIP」などのタームを設定します。「プレミアム」タームの権限を「プレミアム会員」ロールに割り当てます。コンテンツに適切なアクセスタームをタグ付けします。無料ユーザーは「無料」コンテンツのみを閲覧でき、プレミアム会員は無料とプレミアムの両方のコンテンツを閲覧できます。
ロールベースアクセスを持つ学校ウェブサイト
「対象者」ボキャブラリーを作成し、「生徒」「教師」「管理者」などのタームを設定します。対応するユーザーロールにターム権限を割り当てます。「教師」でタグ付けされたコンテンツは、教師ロールを持つユーザーのみが閲覧できます。これにより、学校の異なる関係者向けに異なるコンテンツセクションを提供できます。
部門ベースアクセスを持つ企業イントラネット
各部門(人事、エンジニアリング、営業)のタームを持つ「部門」ボキャブラリーを作成します。ユーザープロファイルフォームでユーザーに部門タームを割り当てます。内部ドキュメントやページに部門タームをタグ付けします。従業員は自分の部門に関連するコンテンツのみを閲覧できます。
コンテンツモデレーションワークフロー
「ノードアクセスレコードを無効化」設定を有効にし、権限を使用して編集レビュー中に未公開コンテンツを編集できるユーザーを制御します。これにより、編集者は公開されるまでコンテンツが公開リストに表示されることなく作業できます。
多言語コンテンツアクセス
権限は言語ごとに保存されるため、言語固有のコンテンツ制限を作成できます。あるタームで英語版へのアクセスは許可するが、ドイツ語版へのアクセスは許可しないということが可能です。地域のコンテンツライセンスに便利です。
Tips
- Drushコマンドを使用して、ターム権限の一括変更後は常にノードアクセス権限を再構築してください
- 「タクソノミーボキャブラリーで制限」設定を使用して、権限に使用するボキャブラリーを制限し、パフォーマンスを向上させてください
- 多くの権限を持つサイトでは、ノードフォームの読み込みを高速化するために「ノードフォームでターム権限情報を非表示」を有効にしてください
- 「すべてのタームの付与を要求」設定は、複数のアクセスレベルを必要とするコンテンツを作成する場合に便利です
- 「ノードアクセスをバイパス」権限を持つユーザーは、ターム権限に関係なく常にアクセスできます
- メディア、パラグラフ、カスタムエンティティタイプへのアクセスを制限する必要がある場合は、Permissions by Entityサブモジュールの使用を検討してください
Technical Details
Admin Pages 1
/admin/permissions-by-term/settings
権限モード、ボキャブラリー制限、表示オプションなど、Permissions by Termモジュールのグローバル設定を構成します。
権限 4
Hooks 8
hook_node_access_records
タームベースの権限用のノードアクセスレコードを実装します。制限されたタームを持つノードに対してnode_accessテーブルにグラントレコードを作成します。
hook_node_grants
ユーザーがノードを閲覧するために持っているグラントを提供します。ターム権限に基づいてユーザーがアクセスを許可されているGIDを返します。
hook_node_access
ノードアクセスをチェックし、アクセスが制限されている場合は拒否イベントをディスパッチします。
hook_form_taxonomy_term_form_alter
タクソノミーターム編集フォームに権限フィールドセットを追加し、ユーザーとロールにアクセスを割り当てられるようにします。
hook_form_user_form_alter
ユーザー編集フォームにターム権限割り当てインターフェースを追加します。
hook_options_list_alter
ユーザー権限に基づいて選択リスト内のタクソノミータームオプションをフィルタリングします。
hook_taxonomy_term_delete
タクソノミータームが削除されたときにターム権限をクリーンアップします。
hook_user_cancel
ユーザーのアカウントがキャンセルされたときに、そのユーザーのすべてのターム権限を削除します。
Drush Commands 1
drush permissions-by-term:rebuild
Permissions by Termが管理するすべてのノードのノードアクセスレコードを再構築します。ターム権限の一括変更後や、アクセスレコードが同期されなくなった場合に便利です。
Troubleshooting 5
/admin/reports/status/rebuildでノードアクセスの再構築を実行するか、'drush permissions-by-term:rebuild'を使用してください。Dynamic Page Cacheモジュールが有効になっていることを確認してください。
多くのノードがある場合は、設定で「ノードアクセスレコードを無効化」を有効にしてください。これにより、大規模なキャッシュされていないリストのパフォーマンスが向上しますが、Viewsからのアクセス制御は削除されます。
権限モードは明示的な権限付与を必要とします。ユーザーに少なくとも1つのターム権限が割り当てられていることを確認するか、デフォルトでオープンアクセスにするために権限モードを無効にしてください。
KernelEventListenerが正しく機能していることを確認してください。ユーザーがすべての制限を上書きする「ノードアクセスをバイパス」権限を持っていないことを確認してください。
設定で「ノードアクセスレコードを無効化」がチェックされていないことを確認してください。Dynamic Page Cacheモジュールが有効になっていることを確認してください。
Security Notes 6
- このモジュールは、コンテンツアクセス制御を実装するための推奨方法であるDrupalのNode Access Recordsシステムを使用しています
- 「ノードアクセスをバイパス」権限を持つユーザーは、すべてのタームベースの制限をバイパスします
- 匿名ユーザー(uid 0)には、認証済みユーザーと同様に特定のタームへのアクセスを付与できます
- ターム権限は言語固有です - 英語での権限付与は、他の言語バージョンには自動的に適用されません
- 「ターム編集ページのターム権限フォーム」権限は「アクセス制限」としてマークされています - 信頼できるロールにのみ付与してください
- 本番環境にデプロイする前に、権限設定を十分にテストしてください