匿名ユーザーがブロックやビューなどのコンテンツタイプのノードを表示できないようにする方法はありますか?
ビューでアクセスを制御できますが、ノードのリンクがわかっていれば、最初にログインしなくても表示できます。
匿名ユーザーがブロックやビューなどのコンテンツタイプのノードを表示できないようにする方法はありますか?
ビューでアクセスを制御できますが、ノードのリンクがわかっていれば、最初にログインしなくても表示できます。
回答:
フックhook_node_access()でノードへのアクセスを制御できます:
mymodule.module:
use Drupal\node\NodeInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Access\AccessResult;
function mymodule_node_access(NodeInterface $node, $op, AccountInterface $account) {
if ($account->isAnonymous() && $node->gettype() == 'article') {
return AccessResult::forbidden()->cachePerPermissions();
}
return AccessResult::neutral()->cachePerPermissions();
}
これは、ビューへのアクセスではなく、ノードへの直接アクセスを制御します。しかし、これはおそらくあなたが望むものです。
あなたの最善の策は、ウサギの穴、または更新されたリリースがある場合はコンテンツアクセスを使用することです。
ウサギの穴は、エンティティが独自のページで表示されているときに何が起こるかを制御する機能を追加するモジュールです。カルーセルに表示される画像コンテンツタイプのように、独自のページに表示されるべきではないコンテンツタイプがある可能性があります。Rabbit Holeは、node / xxxを通じて、このノードが独自のページでアクセスできないようにすることができます。
このモジュールを使用すると、ロールおよび作成者ごとにコンテンツタイプの権限を管理できます。これにより、各コンテンツタイプのカスタムビューを指定し、編集および削除することができます。オプションで、コンテンツごとのアクセス設定を有効にして、コンテンツノードごとにアクセスをカスタマイズできます。
私があなたが望むのはコンテンツタイプのノードへのすべてのアクセスをブロックすることであることに注意してください-そして、コンテンツアクセスだけがラビットホールを介してそれを満たします。
それを超えて、あなたはこれらのどちらも適合しない場合にあなた自身のアクセス制御を実装することを検討していると思います。
多分あなたはあなたのサイトにあなたのコンテンツとユーザーの任意のコレクションを作成することを可能にし、それらのコレクションへのアクセス制御パーミッションを付与することを可能にするGroupモジュールを使用する試みを与えたいと思うでしょう。D7以降で利用可能で、D8バージョンもあります。グループをエンティティとして作成し、完全にフィールド化、拡張、エクスポートできるようにします。すべてのグループには、ユーザー、ロール、およびアクセス許可を関連付けることができます(詳細については、「グループモジュールでサポートされるさまざまなロールとは?」を参照してください)。
この特定の質問では、gnode
サブモジュールを有効にし、グループタイプごとに、さまざまなコンテンツタイプに適切な権限(表示、編集、削除など)を定義します。
「メンバー」および「部外者」(=グループのメンバーではないログインユーザー)と呼ばれるグループへのアクセスを許可する必要があるようです。ただし、「匿名」(ログに記録されていないサイト訪問者)へのアクセスは許可しません。
ノードビューのアクセス許可モジュールを使用できます。
これを有効にすると、「ノードビューの権限」セクションのパス「admin / people / permissions」で、どのコンテンツタイプを表示できるかをどのロールに割り当てることができます。