ビューにhook_node_accessを尊重させる


14

hook_node_access()カスタム条件に基づいて、ユーザーが一部のノードへのアクセスを拒否するために使用しています。ただし、ユーザーが条件を満たさない場合、このコンテンツを一覧表示するビューに表示したくありません。ビューにhook_node_access()実装を尊重させる方法はありますか?


Viewsモジュールがで設定されたアクセス許可を実際に尊重しない場合はhook_node_access()、Viewsモジュールのコードを変更するだけです。
キアムルノ

ノードが実際にnode_loadで完全にロードされるまで、フックは起動されないと思うので、おそらくそれがまだ表示される理由です。しかし、hook_node_access()の実装が人を締め出すために使用するのと同じフィルタリング方法を使用するフィルタープラグインの作業を開始しました。私はすべてのビューでそのフィルターを追加することを忘れないでください、それは動作するはずです。他の人が恩恵を受けることができるように、私が終わったら、私はそれについての情報でここに戻ります
ネネ

わかりました、それで私のユースケースはこれでした:顧客はあらゆるノードに適用可能な10レベルのアクセスを望み、ユーザはアクセスレベルの下ですべてのノードを見ることができるはずです。これは、標準のノードビューのhook_node_accessで簡単に解決できました。ただし、ビューはこれを尊重しなかったため、引数のカスタムphpコードを使用してコンテキストフィルターを作成しました。基本的に、PHPコードは、ユーザーアクセスレベルの値以下の値を返します(適切な構文は、で区切られています)。このソリューションの欠点は、すべてのビューでこの構成が必要になることです。
ネネ

この問題を扱うビューの問題を発見しました。問題を解決する適切な方法も参照しています:drupal.org/node/1266388
nenne

2
問題の解決方法に関する回答を書くことができれば、それは完全に受け入れられます。merlinofchaosが言うように、Viewsモジュールはデータベースクエリを使用してノードをロードしていますhook_node_access()。これが実装が尊重されない理由です。「設計」であるため、回避策の報告は問題ありません。
キアムルノ

回答:


6

少し前にここで同じ質問がありまし

hook_node_accessviewsまたはによって認識されませんmenus。最後の防衛線としてのみ使用する必要があります。

制御ノードへのアクセスには良い方法を介して行われhook_node_access_recordsかつhook_node_grants説明したように、ここここ



1

ビューはSQLを使用して、表示するノードを決定します。悲しいことに、パフォーマンス上の理由から、Drupalがすべての潜在的な候補に対してnode_loadを実行し、それらすべての候補に対してhook_node_accessを呼び出すことは単に実行不可能です。何千ものノードを表示するビューを想像してください(特にページャーを使用している場合)。ロジックがSQLで行われない場合、ページャーは非常に珍しい機能を持ちます。したがって、Drupalは、データベースのアクセスレコードを使用してrikが述べたように、それを強制します。

access_recordsの作成はかなり多くの作業を伴いますが、SQLで動作するようになります。したがって、既存のnode_accessモジュールを使用して可能な限り機能を解決することをお勧めします。これは、おそらくアクセスレコードを使用して実装され、ビューで機能するためです。

ちなみに、アクセスレコードは、以下に示すように、node_accessテーブルに格納されます。ここに画像の説明を入力してください 各列のコメントを見る と、その目的を理解できます。レルムはノードアクセスに使用されるシステム、gidはレルム内のグループと考えてください。そのグループは、表示、更新、および削除の許可を持つことができます。一般に、各node_accessモジュールは1つ以上のレルムを定義します(複数のnode_accessモジュールが並行して動作することもあります)。ユーザーは、各レルムに1つ以上のGIDを持っています。

Drupalでは、「node_access」タグを持つすべてのクエリに、いくつかの特別なロジックが自動的に追加されます。ドキュメントを参照してくださいタグ付けのを。この特別なロジックは、各レルムの「node_access」テーブルを結合し、「gid」がユーザーに適用されたgidの1つに等しい場合に、ユーザーが適切な権限を持っているという条件を追加します。

このシステム全体により、すべてのクエリでnode_accessを適切に処理したり、クエリをカウントしたりすることもできます。非常に強力ですが、単純なhook_node_accessよりも学習曲線が高くなっています。可能な限り、既存のnode_accessモジュールを使用すると、この頭痛の種をすべて軽減できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.