ノードへの直接アクセスを制限するが、特定のノードタイプの必須フィールドへのアクセスのみをビューに許可する方法は?
たとえば、Views Slideshowでは、特定のノードタイプに属する画像フィールドをスライドしています。ただし、検索エンジンがアクセスしたり、訪問者がそのノードタイプに属するノードにアクセスしたりすることは望ましくありません。
助言がありますか?
ノードへの直接アクセスを制限するが、特定のノードタイプの必須フィールドへのアクセスのみをビューに許可する方法は?
たとえば、Views Slideshowでは、特定のノードタイプに属する画像フィールドをスライドしています。ただし、検索エンジンがアクセスしたり、訪問者がそのノードタイプに属するノードにアクセスしたりすることは望ましくありません。
助言がありますか?
回答:
簡単な解決策は、アクセスしたくないノードを公開しないことです。ビューは、引き続きこれらのノードからデータをプルできます。
user1によって追加されたノードを非公開にした場合、ユーザーがそのコンテンツタイプのコンテンツを編集する権限を持っている場合でも、他のユーザーは編集できません。
ノードページビューの制限は、特定のコンテンツタイプのノードへの直接アクセスを制限するより良い方法のようです。
使用方法も非常に簡単で、このモジュールを有効にして、通常どおり直接アクセスできるノードのアクセス許可を構成するだけです。
http://drupal.org/project/restrict_node_page_view
プロジェクトページから:
公開する必要があるスライドショーのノードタイプを使用したことがありますが、node / XXXパスを使用してノードが単独でアクセスできるようにしたくないですか?このモジュールはあなたのためです!
このモジュールを使用すると、ノードタイプと権限に基づいて、ノードページ(node / XXX)への直接アクセスを無効にできます。
モジュールを有効にし、許可を設定することを忘れないでください。
同じことをしますが、より多くの機能を備えた他のモジュール。
このプロジェクトのメンテナーは、「ノードページビューを制限する」メンテナーに課題のプロジェクトをマージするよう依頼します。
「ノードページビューの制限」に対する利点:
「ノードページビューの制限」に対するデメリット:
を使用する必要がありますがnode_access()
、を使用して簡単に実装できる特定のオプションがありますhook_node_access()
。実装node_access()
により、誰がノードにアクセスでき、誰がそのようなノードを作成、削除、編集、または更新できるかを決定できます。ただし、ビューはこれらのノードからデータをプルできます。
https://www.drupal.org/project/restrict_node_page_viewに触発されて、自分で小さなモジュールを書くことができます。
/**
* Implements hook_node_access()
*/
function MYMODULE_node_access($node, $op, $account) {
// Default checks
if (!is_object($node)) {
return NODE_ACCESS_IGNORE;
}
$type = is_string($node) ? $node : $node->type;
if($op == 'view' && arg(0) == 'node' && arg(1) === $node->nid) {
// Restrict access to full MYTYPE node for anon users
if ($type == 'MYTYPE' && user_is_anonymous()) {
return NODE_ACCESS_DENY;
}
}
// Default
return NODE_ACCESS_IGNORE;
}
Rulesモジュールを使用すると、次のようなルールを実装できます。
{ "rules_check_url" : {
"LABEL" : "Disallow node/* access",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules" ],
"ON" : { "init" : [] },
"IF" : [
{ "text_matches" : {
"text" : [ "site:current-page:url" ],
"match" : "node\/\\d+$",
"operation" : "regex"
}
}
],
"DO" : [
{ "drupal_message" : {
"message" : "Sorry, direct access to URLs like [site:current-page:url] is not allowed around here ...",
"type" : "error"
}
},
{ "redirect" : { "url" : "no_access" } }
]
}
}
上記のルールは、(まだ)選択したロールにのみ「アクション」を適用することを考慮していません(たとえば、管理者がこれらのパスを使用してノードを表示できるようにするため)。しかし、ルールモジュールに少し精通している人にとっては、それは追加する単純な「条件」です...
独自のサイトでこのルールを試すには、上記のルールコード全体をコピーし、「インポート」機能を使用して作成した独自のサイトの新しいルールに貼り付けます。次に、さらに編集/調整して、ご使用の環境に合うようにします(表示される「Sorry、...」メッセージなど)。