Je souhaite rediriger un utilisateur anonyme vers le formulaire de connexion si cet utilisateur rencontre une erreur 403.
J'ai créé un abonné aux événements et voici mon code, mais je me retrouve en boucle sur la page actuelle.
/**
* 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);
}
}
Je pense que cela est lié au fait que la réponse contient déjà la destination (uri actuel) et system.404 et system.403 ont une haute priorité qui m'empêche de passer outre.
8
routes
redirection
Pierre.Vriens
la source
la source
Réponses:
J'ai vu qu'il n'a jamais été répondu à cette question comment procéder par programme. Le code fonctionne réellement, lorsqu'il est placé dans un abonné d'exception:
/src/EventSubscriber/RedirectOn403Subscriber.php:
mymodule.services.yml:
la source
Le moyen le plus simple est de parcourir
/admin/config/system/site-information
et de remplir le champ qui se litDefault 403 (access denied) page
avecuser/login
la source
En regardant simplement le titre de cette question (= Comment rediriger l'utilisateur vers le formulaire de connexion à partir de 403? ), Il y a 2 options pour le faire, sans aucun code personnalisé impliqué, comme détaillé ci-dessous.
Option 1: utilisez le module CustomError
Le module CustomError permet à l'administrateur du site de créer des pages d'erreur personnalisées pour les codes d'état HTTP 403 (accès refusé) et 404 (introuvable), sans créer de nœuds pour chacun d'eux. Quelques détails supplémentaires sur ses fonctionnalités (à partir de sa page de projet):
Vous serez probablement intéressé principalement par la partie " Les utilisateurs qui ne sont pas connectés et tentent d'accéder à une zone qui nécessite une connexion seront redirigés vers la page à laquelle ils tentaient d'accéder après leur connexion. ".
Pour D8, il existe également une version 8.x-1.x-dev pour ce module, plus de détails à ce sujet peuvent être trouvés dans le numéro # 2219227 .
Option 2: utilisez le module Règles
Supposons que le chemin de la page "403 par défaut" est défini sur
no_access
(via admin). Créez ensuite une règle à l'aide du module Règles , avec comme événement quelque chose comme "Après avoir visité le nœudno_access
". Pour que la règle entière ressemble à ceci:no_access
Conditions:
Parameter: User: [site:current-user], Roles: anonymous user
Parameter: Text: [site:current-page:url], Matching text: user/login
Actions: Redirection de page -
Parameter: URL: user/login
Si vous le souhaitez, vous pouvez même ajouter une autre action pour afficher également un message (informatif) dans la zone de message Drupal, avec quelque chose comme "Vous avez essayé de visiter une page pour laquelle une connexion est requise ...".
Certes, cela peut vous obliger à activer un module supplémentaire contribué ( règles ). Mais, comme l'indique également sa popularité croissante, ce module est probablement déjà activé dans la plupart des sites (similaire au module Views ), car il existe des dizaines de cas d'utilisation pour ce module.
Pour D8, il existe également une version 8.x-3.x-alfa1 pour ce module, plus de détails sur sa version D8 peuvent être trouvés dans le numéro 2574691 , qui inclut un lien vers le problème de règles " Rules 8.x Roadmap "
Si ce qui précède ne vous aide pas, vous voudrez peut-être vérifier si la raison de votre boucle (ou "une priorité élevée" comme dans votre question) ne peut pas être empêchée / expliquée par quelque chose de similaire à la réponse à la question " Comment spécifier un événement de règles tel que "Le contenu sera" affiché "? ".
la source
Je suppose que la solution à votre problème est simple. Vous pouvez facilement créer une page personnalisée pour
404
,403
puis à l'intérieur de cette page, rediriger les utilisateurs anonymes vers la/user
page.Vous pouvez utiliser ce code
Chaque fois que 404 se produit, vous
page--404.tpl.php
serez utilisé. Dans cette page, utilisez ce codeLa page Comment créer des pages 403 et 404 personnalisées dans Drupal explique une autre méthode de création d'une page pour
403
et404
.la source
8
formatLa façon la plus simple de le faire est d'utiliser le module Rediriger 403 vers la connexion utilisateur (une version de développement de celui-ci existe pour D8). Voici une citation à ce sujet (à partir de sa page de projet):
la source
7
et6
(1) créer un nœud de page avec un alias comme "/my403.html"
(2) allez dans / admin / config / system / site-information et définissez "/my403.html" comme 403-Errorpage
(3) allez dans / admin / structure / block et ajoutez le bloc "User login" (Sec. Forms) à la zone de contenu principale. Limitez l'apparence du bloc à la page "my403.html" et au rôle "invité".
C'est ça.
Si vous avez besoin de plus de contrôle, créez un contrôleur pour votre page 403 et ajoutez manuellement UserLoginForm.
Cordialement, Rainer
la source