web-dev-qa-db-ja.com

プログラムでフィルターNode権限、ビューなどを超えたアクセス

短縮版:

動的な値に基づいてノードがユーザーにどのように表示されるか(バイナリの意味:公開されているか非表示か)をフィルタリングする最良の方法は何でしょうか。このソリューションは、権限、ビュー、コンテンツアクセスなどの一般的なモジュールの範囲を超えています。

ロングバージョン:

私のアプリケーションでは、時間とともに変化する値に基づいてユーザーを選択するために、選択ノードを表示させる必要があります。たとえば、ユーザーがノードにアクセスしたいが、ユーザーとノードの両方が場所を(毎日)変更するとします。顧客がサイト(または任意のページ)を表示するとき、指定した範囲のノードのみを表示できるようにしたいと考えています。このため、基本的な権限とビューおよびその他のストックDrupalモジュールは効果がないようです。ユーザーの変数が非常に多いため、権限システムを使用するのは悪い方法のようです。 /ノードの関係。ノードは他のユーザー、プロセスなどに対してアクティブな状態を維持する必要があるため、ノードを非公開にできません。距離を測定するためのカスタムphpコードを使用した動的ビューフィルターでも、直接入力してノードにアクセスできるため、効果がありません。 URL。

これまでのところ、hook_node_load()を使用して計算を実行し(ユーザーとノードの関係を決定し)、適用可能なノードのみを返すことを計画しています。これにより、使用できないノードへの直接URLアクセスが防止され、存在するが基準に一致しないアクティブノードが維持されます。デフォルトでは、

2
kevinaskevin

node_access_example.module(リンク) は、ノードAPIを介したノードのカスタムフィルタリングの問題に対する最良の応答であると思われます。それといくつかの他のコメント (1)(2) は、これらをこのタスクを達成するための主要なフックであると説明しています:

hook_node_access()  
hook_node_access_records()  
hook_node_grants() 
0
kevinaskevin

ユーザーがノードのURLを直接入力できないようにするとします。 do許可を使用する必要があることを私に示唆しています。

その理由は、Drupalのどの部分がノードを表示しているのかわからないためです。たとえば、drupal_gotohook_bootを手動で挿入して、独自のカスタム権限を提供できます。ノードIDのURLの処理、テスト-ただし、ノードは引き続きビューからアクセスできます。Drupalの優れた点は、あらゆる種類のモジュールがあらゆる種類の方法でデータを使用できることです-ただし、これは、他のモジュールが理解できる方法でデータ(その場合は権限)を提示する必要があることを意味します。

あなたの許可は距離ベースであると言います。つまり、ユーザーごとに1つのロールを持つことになるため、ロールベースの権限を使用することはできません。ただし、使用できるのは ACLモジュール です。これにより、ユーザー/ノードごとの権限を定義できるAPIが提供されます。

次に、hook_node_update/hook_user_updateを実装して、権限を再計算し、ノード/ユーザーが変更されたときにそのノード/ユーザーのACLを変更する必要があります。

2
Alice Heaton