匿名ユーザーが403エラーに遭遇した場合に、そのユーザーをログインフォームにリダイレクトしたいと思います。
私はイベントサブスクライバーを作成しましたが、これは私のコードですが、現在のページでループに陥っています。
/**
* Redirect anonymous user to login page if he encounters 404 or 403
* response.
*
* @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $response
* The created response object that will be returned.
* @param string $event
* The string representation of the event.
* @param \Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher $event_dispatcher
* Event dispatcher that lazily loads listeners and subscribers from the dependency injection
* container.
*/
public function checkLoginNeeded(GetResponseEvent $response, $event, ContainerAwareEventDispatcher $event_dispatcher) {
$routeMatch = RouteMatch::createFromRequest($response->getRequest());
$route_name = $routeMatch->getRouteName();
$is_anonymous = \Drupal::currentUser()->isAnonymous();
$is_not_login = $route_name != 'user.login';
if ($is_anonymous && $route_name == 'system.403' && $is_not_login) {
$query = $response->getRequest()->query->all();
// $query['destination'] = $routeMatch->getRouteObject()->getPath();
$query['destination'] = \Drupal::url('<current>');
$login_uri = \Drupal::url('user.login', [], ['query' => $query]);
$returnResponse = new RedirectResponse($login_uri, Response::HTTP_FOUND);
$response->setResponse($returnResponse);
}
}
これは、応答にすでにdestination(current uri)が含まれており、system.404とsystem.403には優先度が高く、これをオーバーライドできないという事実に関連していると思います。
この質問がプログラムでこれを行う方法に決して答えられなかったことを私は見た。例外サブスクライバーに配置すると、コードは実際に機能します。
/ src/EventSubscriber/RedirectOn403Subscriber.php:
<?php
namespace Drupal\mymodule\EventSubscriber;
use Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Url;
class RedirectOn403Subscriber extends HttpExceptionSubscriberBase {
protected $currentUser;
public function __construct(AccountInterface $current_user) {
$this->currentUser = $current_user;
}
protected function getHandledFormats() {
return ['html'];
}
public function on403(GetResponseForExceptionEvent $event) {
$request = $event->getRequest();
$is_anonymous = $this->currentUser->isAnonymous();
$route_name = $request->attributes->get('_route');
$is_not_login = $route_name != 'user.login';
if ($is_anonymous && $is_not_login) {
$query = $request->query->all();
$query['destination'] = Url::fromRoute('<current>')->toString();
$login_uri = Url::fromRoute('user.login', [], ['query' => $query])->toString();
$returnResponse = new RedirectResponse($login_uri);
$event->setResponse($returnResponse);
}
}
}
mymodule.services.yml:
services:
mymodule.exception403.subscriber:
class: Drupal\mymodule\EventSubscriber\RedirectOn403Subscriber
tags:
- { name: event_subscriber }
arguments: ['@current_user']
最も簡単な方法は、_/admin/config/system/site-information
_を参照し、Default 403 (access denied) page
を読み取るフィールドに_user/login
_を入力することです
この質問のタイトル(= ユーザーを403からログインフォームにリダイレクトする方法?)を見るだけで、以下のようにカスタムコードを使用せずに、2つのオプションがあります。
CustomError モジュールを使用すると、サイト管理者はHTTPステータスコード403(アクセス拒否)および404(見つかりません)のカスタムエラーページを作成できますが、それぞれにノードを作成する必要はありません。機能に関する詳細(プロジェクトページから):
- 設定可能なページのタイトルと説明。
- 通常のノードのように作成者と日付/時刻ヘッダーはありません。
- HTML形式のテキストはページの本文に配置できます。
- エラーページはtheableです。
- ログインしていないユーザーがログインを必要とする領域にアクセスしようとすると、ログイン後にアクセスしようとしていたページにリダイレクトされます。
- 404のカスタムリダイレクトを許可します。
「ログインしていないユーザーがログインを必要とする領域にアクセスしようとすると、ログイン後にアクセスしようとしたページにリダイレクトされます。 "。
D8の場合、 8.x-1.x-devバージョンがあります このモジュールについても利用できます。詳細については、 課題#2219227 を参照してください。
「デフォルト403」ページのパスがno_access
(管理者経由)に設定されているとします。次に、 ルール モジュールを使用して、イベントのように「ノードno_access
にアクセスした後」のようなルールを作成します。したがって、ルール全体は次のようになります。
no_access
にアクセスした後条件:
Parameter: User: [site:current-user], Roles: anonymous user
Parameter: Text: [site:current-page:url], Matching text: user/login
アクション:ページリダイレクト-Parameter: URL: user/login
そうする必要がある場合は、別のActionを追加して、Drupalメッセージ領域にいくつかの(情報)メッセージを表示することもできます。ログインが必要なページにアクセスしてください...」.
確かに、追加のモジュール( ルール )を有効にする必要があるかもしれません。しかし、その人気の高まりからもわかるように、このモジュールには数十のユースケースがあるため、そのモジュールはおそらく( ビュー モジュールと同様に)ほとんどのサイトですでに有効になっています。
D8の場合、このモジュールの 8.x-3.x-alfa1 バージョンも利用できます。そのD8バージョンの詳細は、 課題番号2574691 にあり、ルールへのリンクが含まれています「 ルール8.xロードマップ 」を発行します
上記の方法で問題が解決しない場合は、ループの理由(または質問の「優先度が高い」)を、質問への回答と同様の何かで防止または説明できないかどうかを確認することをお勧めします " 方法「コンテンツは「表示される」と表示される」などのルールイベントを指定するには? ".
あなたの問題の解決策は簡単だと思います。 404
と403
のカスタムページを簡単に作成し、このページ内で匿名ユーザーを/user
ページにリダイレクトできます。
このコードを使用できます
function YOURTHEME_preprocess_page(&$vars) {
$header = drupal_get_http_header('status');
if ($header == '404 Not Found') {
$vars['theme_hook_suggestions'][] = 'page__404';
}
}
404が発生するたびに、page--404.tpl.php
が使用されます。このページでは、このコードを使用します
if(user_is_logged_in() == false){
/// You can do anything here.
}
Drupalでカスタム403および404ページを作成する方法 は、403
および404
のページを作成する別の方法を説明しています。
これを行う最も簡単な方法は、 リダイレクト403をユーザーログインに モジュールを使用することです(D8の開発バージョンが存在します)。これについての引用は次のとおりです(プロジェクトページから)。
HTTP 403エラーページをDrupal/user/loginページにリダイレクトします。オプションのメッセージは次のとおりです。
「アクセスが拒否されました。このページを表示するにはログインする必要があります。」
また、目的のページがurlクエリ文字列に追加されるため、ログインが成功すると、ユーザーは最初にアクセスしようとした場所に直接移動します。
(1)「/my403.html」のようなエイリアスを持つページノードを作成します
(2)/ admin/config/system/site-informationに移動し、「/ my403.html」を403Errorpageに設定します
(3)/ admin/structure/blockに移動し、「ユーザーログイン」ブロック(Sec。フォーム)をメインコンテンツ領域に追加します。ブロックの外観をページ "my403.html"とロール "guest"に制限します。
それでおしまい。
さらに制御が必要な場合は、403ページのコントローラーを作成し、UserLoginFormを手動で追加します。
よろしく、ライナー