Leiten Sie Benutzer programmgesteuert auf die Standardeinstellung "Zugriff eingeschränkt" um.

12

Ich möchte meine Benutzer programmgesteuert auf die Standardseite "Zugriff eingeschränkt" umleiten. Ich weiß, dass ich für eine einfache Umleitung ein "RedirectResponse" -Objekt benötige, aber wie gebe ich hier die Standardseite "Zugriff eingeschränkt" an?

Jepster
quelle
1
Normalerweise wird eine Seite mit "Zugriffsbeschränkung" erstellt, indem ein 403-Statuscode zurückgegeben und nicht auf eine andere Seite umgeleitet wird. Haben Sie so etwas wie versuchtreturn new Response('', Response::HTTP_FORBIDDEN);
Pierre Buyle

Antworten:

24

Sie können an jeder Stelle in Ihrem Code eine Ausnahme auslösen:

403:

throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException();

404:

throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();

Die Ausnahme wird dann von DefaultExceptionHtmlSubscriber abgefangen und eine Unteranforderung für /system/403oder /system/404wird zurückgegeben, die Sie in den grundlegenden Site-Einstellungen konfigurieren können, wenn Sie keine generische Seite "Zugriff verweigert" oder "Nicht gefunden" anzeigen möchten.

Andere Optionen hängen davon ab, wo der Code platziert wird:

  • Gibt eine 403- oder 404-Antwort von einem Controller oder einem Formular zurück

  • Legen Sie eine Antwort in einem Ereignis fest, wenn Sie sich in einem Ereignisabonnenten befinden.

Was Sie niemals tun sollten, ist eine Antwort direkt zu senden. Dies stoppt den Code nicht und erzeugt zwei Antworten, eine, die Sie gesendet haben, und eine, die vom Drupal-Kernel zurückgegeben wurde. Dies führt zu unvorhersehbarem Verhalten.

4k4
quelle
2

Dies scheint der richtige Weg zu sein:

    $response = new RedirectResponse('/system/403');
    $event->setResponse($response);
Jepster
quelle
2

Erstellen Sie Ihre Umleitung von der Route, auf der der Zugriff des Systems verweigert wurde.

$url = Url::fromRoute('system.403');
$response = new RedirectResponse($url->toString());

Hiermit gelangen Sie zur Seite mit dem verweigerten Drupal-Standardzugriff. Die Route ist system.routing.ymlim Kern definiert .

Die beste Antwort gibt Ihnen einen kaputt aussehenden browserbasierten Zugriff verweigert, nach dem Sie möglicherweise suchen. Wenn Ihre Drupal-Benutzeroberfläche angezeigt werden soll, verwenden Sie die oben genannten Anweisungen.

CliveCleaves
quelle
0

Auf einer Seite können Sie Folgendes verwenden:

return new \Symfony\Component\HttpFoundation\RedirectResponse(\Drupal::url('your.module.route.name'));

wie: http://www.drupal8.ovh/en/tutoriels/88/page-redirection-on-drupal-8

Oder von einem von einreichen:

$form_state->setRedirect('your.module.route.name');

Konfigurieren Sie dann die Zugriffsberechtigung für 'your.module.route.name'.

Wenn Sie nicht wissen, wie Sie die Zugriffsberechtigung konfigurieren, überprüfen Sie: http://www.drupal8.ovh/en/tutoriels/66/create-a-custom-permission-drupal-8

Netz
quelle
Ich habe versucht, $ response = new Response ('', Response :: HTTP_FORBIDDEN); $ event-> setResponse ($ response); Dies zeigt dem Benutzer nur eine weiße Seite. Das sind zu wenig Informationen. Ich möchte die Standardseite "Zugriff verweigert" von Drupal anzeigen.
Jepster