特定のコンテンツタイプに対する表示および編集権限を持つユーザーがいます。これにより、そのタイプのすべてのノードを表示および編集する権限がすべてのユーザーに付与されます。しかし、実際には、ユーザーごとに一意のノードを作成して、そのユーザーだけがノードを表示および編集できるようにしたいと考えています。Drupal 7でこれを行うにはどうすればよいですか?
特定のコンテンツタイプに対する表示および編集権限を持つユーザーがいます。これにより、そのタイプのすべてのノードを表示および編集する権限がすべてのユーザーに付与されます。しかし、実際には、ユーザーごとに一意のノードを作成して、そのユーザーだけがノードを表示および編集できるようにしたいと考えています。Drupal 7でこれを行うにはどうすればよいですか?
回答:
既存のモジュールを使用して、コンテンツアクセスでそれを行うことができます。これは、ACLと一緒に使用すると、各ユーザーのノードにアクセスするためのアクセス許可を設定できます。
つまり、ノードごとに手動でアクセス許可を設定する必要があります。
ノードを手動で作成し、ノードの所有者として設定されているユーザーのみがノードを表示(および編集)できるようにしたい場合は、カスタムモジュール(つまり、あなたのサイトに使用されます)、そしてhook_node_access()
次のように実装します(コードは読みやすくするために書かれています):
function mymodule_node_access($node, $op, $account) {
// We are interested to existing objects. When the node is being created, Drupal passed the node type instead of the node object.
if (is_object($node)) {
$bool = (
($node->type == 'the node type you need to check') &&
(($op == 'view') || ($op == 'update'))
);
if ($bool) {
if ($account->uid == $node->uid) {
return NODE_ACCESS_ALLOW;
}
else {
return NODE_ACCESS_DENY;
}
}
}
return NODE_ACCESS_IGNORE;
}
このフックの実装を使用すると、作成するコンテンツタイプの各ノードに付与されているアクセス許可を手動で編集する必要はありません。ノードのアクセス許可を変更する必要がないため、ノードの所有者を変更することも簡単です。コードは、ノードの所有者(または作成者)として設定されたユーザーに、更新および表示のアクセス許可を自動的に付与します。
あなたが話しているのは、大きな主題であるDrupalノードのアクセス制御です。
ノードアクセス制御に対するコアの組み込みサポートはかなり進んでおり、ロールを使用してノードを表示するためのアクセスを制御するには、何らかのノードアクセス制御モジュールを使用する必要があります。Drupal.orgには、すべてのノードアクセスモジュールを一覧表示するページがあり、それぞれのカプセルレビューが記載されています。アクセスを制御するための適切なモジュールを見つけることができるかどうかを確認するために、そのページをご覧になることをお勧めします。
フレキシアクセスのように、モジュールは、あなたの要件に最も近い一致するモジュールであると思われる主な機能はなく、役割によって、あるいは分類用語で、あなたは個々のユーザーのアクセスを制御できるようにすることです。
これは、個々のユーザーのACL(アクセス制御リスト)を設定できる小さなモジュールです。これは基本的にACLモジュールのユーザーインターフェイスであるため、これもインストールする必要があります。
Content Accessなどのより高度なアクセス制御モジュールの一部の機能はありませんが、積極的にメンテナンスされており、現在、問題キューに未解決のバグはありません。
開示:私はFlexi Accessのメンテナーです。