403エラーの後に匿名ユーザーをログインフォームにリダイレクトする方法


13

匿名ユーザーが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に高い優先度があるため、これをオーバーライドできないという事実に関連していると思います。


メソッドだけでなくクラス全体を追加できますか?
googletorp

$ events [KernelEvents :: REQUEST] = 'checkLoginNeeded';のみがあります。getSubscribedEvents()メソッド内。

回答:


13

最も簡単な方法は、を参照している/admin/config/system/site-informationと読みフィールドに入力Default 403 (access denied) pageしてuser/login


7
これは良い解決策ですが、説明で述べたように、ユーザーが既にログインしている可能性があるという事実を考慮していません。

13

この質問には、プログラムでこれを行う方法が回答されていないことがわかりました。例外サブスクライバーに配置すると、コードは実際に機能します。

/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']

4
これは動作し、関連するモジュール(ルールが含まれる)が安定したリリースになるまで、おそらく最良の答えです。私は追加する必要がありました- >へのtoString()$クエリ[ '先'] =のURL :: fromRoute( '<現在>'が)仕事にこれを取得する
コリン・シプトン

2
この答えはもっと高く現れるに値する!
pbonnefoi

9

この質問のタイトル(= 403からログインフォームにユーザーをリダイレクトする方法?)を見るだけで、カスタムコードなしで、次の2つのオプションがあります。

オプション1:CustomErrorモジュールを使用する

CustomErrorのモジュールは、サイト管理者は、HTTPステータスコード403(アクセスが拒否された)と404のカスタムエラーページを作成することができ、それらのそれぞれのノードを作成することなく、(見られません)。その機能に関する詳細(プロジェクトページから):

  • 構成可能なページのタイトルと説明。
  • 通常のノードと同様に、作成者と日付/時刻ヘッダーはありません。
  • HTML形式のテキストをページ本文に挿入できます。
  • エラーページはテーマ適用可能です。
  • ログインしていないユーザーがログインが必要な領域にアクセスしようとすると、ログイン後にアクセスしようとしていたページにリダイレクトされます。
  • 404のカスタムリダイレクトを許可します。

ログインしていないユーザーがログインを必要とするエリアにアクセスしようとすると、ログイン後にアクセスしようとしたページにリダイレクトされます。」に関する部分におそらく関心があるでしょう。

D8には、このモジュールの8.x-1.x-devバージョンもあります。詳細については、問題#2219227を参照してください

オプション2:ルールモジュールを使用する

「デフォルト403」ページのパスがno_access(admin経由で)設定されていると仮定します。次に、Rulesモジュールを使用して、イベントとして「ノードにアクセスした後」などのルールを作成しますno_access。したがって、ルール全体は次のようになります。

  • イベント:ノードを訪問した後no_access
  • 条件:

    1. ユーザーには役割があります -Parameter: User: [site:current-user], Roles: anonymous user
    2. NOTテキスト比較 -Parameter: Text: [site:current-page:url], Matching text: user/login
  • アクション: ページのリダイレクト -Parameter: URL: user/login

そうしたい場合は、別のアクションを追加して、「ログインが必要なページにアクセスしようとしました...」など、Drupalメッセージ領域に(情報)メッセージを表示することもできます。

確かに、追加の貢献モジュール(Rules)を有効にする必要があるかもしれません。しかし、人気が高まっていることからもわかるように、このモジュールには多くのユースケースがあるため、おそらくほとんどのサイトで(Viewsモジュールと同様に)そのモジュールが既に有効になっています。

D8の場合、このモジュールの8.x-3.x-alfa1バージョンも利用できます。D8バージョンの詳細は、問題#2574691にあります。これには、ルールの問題「Rules 8.x Roadmap」へのリンクが含まれています。

上記が役に立たない場合は、ループの理由(または質問の「優先度の高い」)が、「指定方法「コンテンツは「表示予定」になります」などのルールイベント?


4

あなたの問題の解決策は簡単だと思います。あなたは簡単にカスタムページを作成することができます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


5
こんにちは、タグとコードを確認する必要があります。この男は明らかにDrupal 8を使用しています
。– alexej_d

1
こんにちは、私は彼にアルゴリズムを与えました、彼は簡単にそれを8フォーマットに変更することができます
ママD

3

これを行う最も簡単な方法は、リダイレクト403をユーザーログインモジュールに使用することです(D8用の開発バージョンが存在します)。これについての引用は(プロジェクトページから):

HTTP 403エラーページをDrupal / user / loginページにリダイレクトします。オプションのメッセージは次のとおりです。

「アクセスが拒否されました。このページを表示するにはログインする必要があります。」

また、URLクエリ文字列に目的のページが追加されるため、ログインが成功すると、ユーザーは最初に行こうとしていた場所に直接移動します。


1
なぜこの答えはダウン投票されますか?
ミロシュクルリック

@ milos.kroulik質問はDrupalの8についてですが、そのモジュールがためのものですので、私は推測する76
M AMA D

1
ノーそのモジュールは開発中のDrupal 8バージョンを持っている
コリン・シプトン

1
確かに、ダウン票は「リンクのみ」の回答であるためです(回答がダウン票される、または削除される典型的な理由は...)。通常、このような回答は「低品質の回答」レビューキューにも表示されます...この回答の編集バージョンを参照してください。
Pierre.Vriens

ユーザーが既にログインしている場合、またはサイトがfast404および403を使用している場合、この回答は考慮されません。

0

(1)「/my403.html」などのエイリアスを使用してページノードを作成します

(2)/ admin / config / system / site-informationに移動し、「/ my403.html」を403-Errorpageに設定します

(3)/ admin / structure / blockに移動し、「ユーザーログイン」ブロック(Sec。Forms)をメインコンテンツ領域に追加します。ブロックの外観をページ「my403.html」およびロール「guest」に制限します。

それでおしまい。

さらに制御が必要な場合は、403ページのコントローラーを作成し、UserLoginFormを手動で追加します。

よろしく、レイナー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.