How to redirect an anonymous user to the login form after a 403 error in Drupal 8 & 9
Code snippet that can be used to redirect an anonymous user to the login form after a 403 error in Drupal 8 & 9.
First step you need to add custom service, in MODULENAME.services.yml:
services:
mymodule.exception403.subscriber:
class: Drupal\mymodule\EventSubscriber\RedirectOn403Subscriber
tags:
- { name: event_subscriber }
arguments: ['@current_user']
Then add RedirectOn403Subscriber.php
for your custom event subscriber in your module in the /src/EventSubscriber/
folder.
<?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);
}
}
}
if you want to redirect user for specific page you can use check your path page with this code:
\Drupal::service('path.current')->getPath() == '/node/path'
Example 2:
<?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();
if ($is_anonymous && \Drupal::service('path.current')->getPath() == '/node/add/article') {
$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);
}
}
}