別のスレッドの提案に従って ここ Drupalの許可システムでhook_node_access
を使用して開発したアクセス制限(およびこれまでのところうまく機能している)を書き直そうとしています(つまり、hook_node_access_records
とhook_node_grants
を使用しています)。私はそれを2つの理由でしたいと思います:
これが、現在のアクセスチェックの一部を省略したものです。
function mymodule_node_access(\Drupal\node\NodeInterface $node, $op, \Drupal\Core\Session\AccountInterface $account){
$type = $node->bundle();
$user = $account->getAccount();
$uid = $user->id();
// only handle the lesson content type
if ($type === 'lesson') {
// ...
// check the user's access to the referring courses
$courseaccess = FALSE;
if ($node->hasField('reverse_entity_reference')) {
$parentcourses = $node->get('reverse_entity_reference')->getValue();
foreach ($parentcourses as $course) {
$coursenode = \Drupal\node\Entity\Node::load($course['target_id']);
// perform access checks for the referring course
$courseaccess = $courseaccess || ...
}
}
// ...
// return the result
if ($courseaccess) {
return AccessResult::allowed();
} else {
return AccessResult::forbidden();
}
}
// ...
}
本質的に、現在のユーザーが参照しているノード(courses)のいずれかにアクセスできるかどうかをチェックする必要があることに注意してください。表示されたノード(lessons):これは、ユーザーがlessonにアクセスできるかどうかを決定します。そのために逆エンティティ参照を使用しています。
それを見ると(私は提案を受け入れることができます)、これに取り組むには基本的に2つの方法があります。残念ながら、これまでのところ、関連する問題を解決できていません。だから、私の理解では、私は...
hook_node_grants
に入れます:つまり、私はhook_node_grants
で現在表示されているノード(lesson)にアクセスできる必要があるため、ユーザーが参照ノードのいずれかにアクセスできるかどうかを確認するための逆参照。それは可能ですか? $node
変数はありません...hook_node_access_records
に入れます:その場合、ノードがいつでもフックが呼び出される(したがってlessonが更新される)だけであることが問題です保存されます。したがって、レッスンが別のコースに含まれるとすぐに、アクセス制限は古くなります。この時点でどのように進めるかわかりません。助成金制度でこれを書き換えることは可能ですか?他のアイデアは?
要件の完全なリストがなく、Q&Aが長時間のディスカッションに適さない場合、明確にイエスと言うことは不可能です。
助成金システムは、階層のあらゆる種類のアイデアを中心に設計されていません。書き換えは可能ですか?付与システムが提供するものに関して既存のロジックをリファクタリングできるかどうかによって異なります。
あなたは質問をジレンマとして組み立てましたが、グラントシステムを使用するには両方のフックが本当に必要です。
hook_node_grants
_は、_$user
_に対応するrealm
/gid
許可と、彼らがアクセスできる利用可能なレッスンnid
を割り当てる必要があります。hook_node_access_records
_は、レッスンに対して起動する必要があります_$node
_だからできるなら:
realm
/gid
付与キーをマップして、ユーザーがアクセスできるコースに一致させます(例_mymodule_course_realm
_/_123
_ where _123
_マップするいくつかのグループ識別子)コースへのアクセス権を持つユーザーのグループへのレッスンnid
アクセス権)hook_node_update
_、_hook_node_insert
_などを使用して更新コースを探し、レッスンノードでダミー保存を行う)。これにより、_hook_node_access_records
_は、関係が変更されたlessonノードに対して起動できます。 (または、NodeGrantDatabaseStorage::write()
を介して直接許可を挿入するカスタムロジックを構築します)おそらく、グラントシステムが提供するフックをリファクタリングすることができます。