Blog 27.12.2021

Typo3 v11 und Fehlerbehandlung 403

Diesmal möchten wir unsere Lösung teilen, die sehr nützlich ist, wenn eine Seite im CMS TYPO3 eine vorherige Anmeldung erfordert, d.h. wir müssen als FE-Benutzer eingeloggt sein. Das CMS selbst gibt uns viele Möglichkeiten, wie wir die Sichtbarkeit von Seiten und einzelnen Elementen auf der Site verwalten können. Im Falle von Seiten kann ein solcher Zugriff im Reiter "ACCESS" konfiguriert werden.

Es stehen 3 Optionen zur Auswahl

  • "Bei Anmeldung ausblenden" - Seite oder Inhaltselement wird nicht ausgeblendet, wenn der Benutzer nicht als FE eingeloggt ist
  • "Bei jeder Anmeldung anzeigen" - die Seite oder das Inhaltselement wird angezeigt, wenn der Benutzer eingeloggt ist
  • "Benutzergruppe" - hier ist es nicht mehr nur wichtig, dass der Benutzer als FE eingeloggt ist, sondern die Gruppe, zu der er gehört, ist bereits wichtig. Ein Benutzer wird angezeigt, wenn er/sie zu einer oder mehreren Gruppen gehört.

Wenn wir keinen Mechanismus haben, der uns auf die Anmeldeseite umleitet, sehen wir den folgenden Fehler

Um dies zu ändern, müssen wir die Unterstützung für den Fehler 403 in die Website-Konfiguration aufnehmen.

oder fügen Sie den folgenden Code in die Datei config/sites/DomainKey/config.yaml ein

PHP
Copied!
errorHandling:
  -
   errorCode: '403'
   errorHandler: PHP
   errorPhpClassFQCN: VendorNameMyExtensionPageHandlerNotAuthorized.

Der nächste Schritt besteht darin, eine Klasse zu erstellen, die sich um die Umleitung zu der Seite kümmert, auf der sich das Anmeldeformular befindet. Zu einer solchen Url erhalten wir einen Referer-Parameter, der die Adresse der Seite enthält, auf der wir uns nach erfolgreicher Authentifizierung anmelden werden.

PHP
Copied!
<?php
declare(strict_types=1);

namespace VendorNameMyExtension\PageHandler;

benutze PsrHttpMessageResponseInterface;
benutze PsrHttp\MessageServerRequestInterface;
use TYPO3\MMS\MessageErrorHandler; use TYPO3\MMS\MessageErrorHandlerInterface;
benutze TYPO3CMSCoreHttpRedirectResponse;
benutze TYPO3CMSCoreHttpUri;
benutze TYPO3CMSCoreSiteEntity;
benutze TYPO3CMSCoreSiteSiteLanguage;
benutze TYPO3CMSCoreSiteFinder;
benutze TYPO3CMSCoreGeneralUtility;
benutze TYPO3CMSCoreExtensionConfiguration;

class NotAuthorized implementiert PageErrorHandlerInterface
{

    /**
     * @var ServerRequestInterface
     */
    protected $request = null;

    /**
     * @param ServerRequestInterface $request
     * @param string $message
     * @param array $reasons
     * @return ResponseInterface
     */
    public function handlePageError(
        ServerRequestInterface $request,
        string $message,
        array $reasons = []
    ): ResponseInterface {
        $this->request = $request;
        return new RedirectResponse($this->getLoginUrl(), 302);
    }

    /**
     * @return string
     */
    protected function getLoginUrl(): String
    {

        $loginPage = $this->getLoginPageId();
        /** @var Site $site */
        $siteFinder = GeneralUtility::makeInstance(SiteFinder::class);
        $site = $siteFinder->getSiteByPageId($loginPage);
        /** @var Uri $uri */
        $uri = $site->getRouter()->generateUri(
            $loginPage,
            [
                '_language' => $this->getLanguageIdentifier(),
                'referer' => $this->request->getUri()->__toString()
            ]
        );
        return $uri->__toString();
    }

    /**
     * @return int
     */
    protected function getLanguageIdentifier(): int
    {
        /** @var SiteLanguage $language */.
        $language = $this->request->getAttribute('language');
        return $language->getLanguageId();
    }

    private function getLoginPageId(): int
    {
        return (int)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('my_extnsion')['loginPage'];
    }

}

Der letzte Schritt besteht darin, eine Datei ext_conf_template.txt zu erstellen, in der wir die Kennung der Seite angeben müssen, auf der sich das Anmeldeformular befindet

PHP
Copied!
# cat=basic/enable; type=string; label=Login Page
loginPage = 97
Über den Autor
Krzysztof Napora
Krzysztof Napora
Krzysztof Napora