View Unpublished
特定のユーザーロールが未公開のNodeを閲覧できるようにし、コンテンツタイプごとに細かなアクセス制御が可能です。
view_unpublished
インストール
composer require 'drupal/view_unpublished:8.x-1.3'
composer require 'drupal/view_unpublished:8.x-1.0'
概要
View Unpublishedモジュールは、Drupalのコンテンツアクセスシステムを拡張し、どのユーザーロールが未公開コンテンツを閲覧できるかを細かく制御できるようにします。デフォルトでは、Drupalは「自分の未公開コンテンツを表示」権限を持つユーザーのみが自分の未公開Nodeを見ることができ、管理者はすべてのコンテンツを見ることができます。
このモジュールは、特定のロールがすべての未公開コンテンツをグローバルに、またはコンテンツタイプごとに閲覧できるようにする新しい権限を追加します。例えば、編集者が未公開の記事をプレビューできるようにしながら、未公開の基本ページへのアクセスは制限することができます。
このモジュールはgrant/realmメカニズムを使用してDrupalのNodeアクセスシステムとシームレスに統合され、URL構造を変更することなく適切なアクセス制御を保証します。また、Views、多言語コンテンツ、Content Moderationモジュールとも正しく動作します。
Features
- コンテンツタイプに関係なくすべての未公開Nodeを閲覧できるグローバルな「すべての未公開コンテンツを表示」権限を提供
- 各コンテンツタイプに対してコンテンツタイプごとの権限(例:「記事: すべての未公開コンテンツを表示」)を自動生成
- コアの「自分の未公開コンテンツを表示」権限と競合せずに併用可能
- モジュールの権限を尊重するカスタムの「公開状態または管理者ユーザー」フィルターを使用してViewsと統合
- 翻訳されたコンテンツに対して言語固有のNodeグラントを適切に処理し、多言語サイトをサポート
- モジュールのインストールまたはアンインストール時にNodeアクセス権限の再構築を自動的にフラグ付け
- Content Moderationモジュールの未公開アクセス権限と互換性あり
- 権限に基づいて未公開コンテンツを表示するために、コアのコンテンツ概要画面(管理 > コンテンツ)と統合
Use Cases
ニュースサイトの編集ワークフロー
ニュースサイトでは、編集者が公開前に未公開の記事をプレビューする必要がありますが、管理者が管理する未公開のランディングページは見えないようにしたいです。編集者ロールに「記事: すべての未公開コンテンツを表示」を割り当て、ページ関連の権限は付与しないようにします。
コンテンツレビューチーム
異なるチームが異なるコンテンツタイプをレビューします。製品チームは製品ページをレビューし、マーケティングチームはブログ投稿をレビューします。各チームにそのコンテンツタイプの権限のみを付与します(例:製品チームには「製品: すべての未公開コンテンツを表示」)。
クライアントのプレビューアクセス
クライアントは公開前にコンテンツをレビューする必要がありますが、完全な管理者アクセスは持つべきではありません。「クライアントレビュアー」ロールを作成し、「すべての未公開コンテンツを表示」権限を付与して、編集機能なしですべての下書きコンテンツをプレビューできるようにします。
Override Node Optionsとの統合
Override Node Optionsモジュールと組み合わせることで、特定のロールが完全なNode管理アクセスを付与することなく、特定のコンテンツタイプの閲覧と公開/非公開の両方を行えるようにできます。
多言語コンテンツのプレビュー
多言語サイトでは、コンテンツを翻訳する編集者が未公開の翻訳をプレビューする必要があります。モジュールは言語固有のグラントを適切に処理し、ユーザーが特定の言語の未公開翻訳を閲覧できるようにしながら、公開バージョンはすべての人がアクセスできる状態を維持します。
Tips
- view_unpublished権限を活用するには、Viewsで常に「公開状態または管理者ユーザー」フィルターを使用してください
- モジュールはURLを変更せずに動作します - 未公開コンテンツは通常のパスのままです
- 完全な編集ワークフローソリューションのためにOverride Node Optionsモジュールと組み合わせてください
- Nodeアクセス権限はキャッシュされます - 権限の変更がすぐに反映されない場合はキャッシュをクリアしてください
- モジュールはコアの「自分の未公開コンテンツを表示」権限を尊重するため、その権限が付与されていればユーザーは常に自分の未公開コンテンツを閲覧できます
- Content Moderationを使用しているサイトでは、モジュールはそのモジュール独自の未公開アクセス権限と統合されます
Technical Details
権限 2
Hooks 4
hook_node_access_records
未公開コンテンツのNodeアクセスグラントを定義します。複数のrealmでグラントを作成します:グローバルアクセス用の'view_unpublished_content'、コンテンツタイプごとのアクセス用の'view_unpublished_{type}_content'、自分のコンテンツアクセス用の'view_unpublished_author'。
hook_node_grants
ユーザーの権限に基づいてNodeアクセスグラントを割り当てます。'view any unpublished content'(グローバル)、'view any unpublished {type} content'(タイプごと)、およびコアの'view own unpublished content'権限をチェックします。
hook_views_plugins_filter_alter
Viewsでview_unpublished権限を適切に処理するために、コアのnode_status ViewsフィルタープラグインクラスをモジュールのカスタムNodeStatusクラスに置き換えます。
hook_views_query_substitutions
現在のユーザーが各タイプの未公開コンテンツを閲覧する権限を持っているかどうかを示すViews用のクエリ置換プレースホルダーを提供します。
Troubleshooting 5
Viewsで「公開済み(= はい)」フィルターではなく、「公開状態または管理者ユーザー」フィルターを使用していることを確認してください。カスタムフィルターはview_unpublished権限を尊重しますが、標準フィルターは尊重しません。
管理 > レポート > ステータス > 再構築でNodeアクセス権限を再構築してください。モジュールのグラントを既存のコンテンツに適用するために必要です。
ユーザーがグローバルな「すべての未公開コンテンツを表示」権限を持っていないか確認してください。この権限はタイプごとの権限を上書きします。細かなタイプごとのアクセスを使用するには、この権限を削除してください。
大量のコンテンツがある場合、Nodeアクセスの再構築にはかなりの時間がかかることがあります。オフピーク時に再構築をスケジュールし、十分なPHPメモリと実行時間の制限を確保してください。
これは以前のバージョンのバグでした。最新バージョンのモジュールに更新してください。更新時に誤った依存関係が自動的に削除されます(update hook 8002)。
Security Notes 5
- このモジュールは意図的に未公開コンテンツへのアクセスを拡大します - どのロールにこれらの権限を付与するか慎重に検討してください
- 未公開コンテンツには、公開を意図していない機密情報や未完成の情報が含まれている可能性があります
- 露出を制限するには、グローバル権限よりもコンテンツタイプごとの権限の方が安全です
- 新しいコンテンツタイプを作成すると新しいタイプごとの権限が自動的に生成されるため、特に新しいコンテンツタイプの作成後は定期的に権限を確認してください
- モジュールは編集や削除のアクセスは付与しません - 未公開コンテンツへの閲覧アクセスのみです