Im nachfolgenden Beispiel wird ein Redirect-Mechanismus implementiert, der den Benutzer nach erfolgtem Frontend-Login (felogin) auf die zuvor angeforderte und zugriffsbeschränkte Seite weiterleitet. Hierbei kommt ein eigener Error Handler zum Einsatz, welcher den Statuscode 403 (forbidden) abfängt. Die ID der Login-Seite wird dynamisch mit den Klassen "RootlineUtility" und "TemplateService" aus den TypoScript Settings ermittelt, damit das ganze auch dynamisch bleibt ;)

Error Handler (Error403Handler.php)

<?php

namespace Vendor\Extension\Error;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Error\PageErrorHandler\PageErrorHandlerInterface;
use TYPO3\CMS\Core\Http\RedirectResponse;
use TYPO3\CMS\Core\Site\Entity\Site;
use TYPO3\CMS\Core\TypoScript\TemplateService;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\RootlineUtility;
use TYPO3\CMS\Extbase\Utility\DebuggerUtility;

class Error403Handler implements PageErrorHandlerInterface {

    /**
     * @param ServerRequestInterface $request
     * @param string $message
     * @param array $reasons
     * @return ResponseInterface
     */
    public function handlePageError(ServerRequestInterface $request, string $message, array $reasons = []): ResponseInterface {

        /** @var Context $context */
        $context = GeneralUtility::makeInstance(Context::class);
        /** @var Site $site */
        $site = $request->getAttribute('site');
        /** @var int $loginPid */
        $loginPid = $this->getLoginPidBySite($site);

        // If user is logged in but cannot access page
        if($context->getPropertyFromAspect('frontend.user', 'isLoggedIn')){
            return new RedirectResponse($site->getRouter()->generateUri($loginPid));
        }

        // Generate redirect response with "return_url" parameter
        $parameters = [
            'return_url' => $request->getUri()->getPath()
        ];
        $uri = $site->getRouter()->generateUri($loginPid, $parameters);
        return new RedirectResponse($uri, 403);
    }

    /**
     * Returns the login page uid
     *
     * @param  Site  $site
     * @return int
     */
    private function getLoginPidBySite(Site $site) {
        /** @var RootlineUtility $rootlineUtility */
        $rootlineUtility = GeneralUtility::makeInstance(RootlineUtility::class, $site->getRootPageId());
        /** @var TemplateService $templateService */
        $templateService = GeneralUtility::makeInstance(TemplateService::class);
        $templateService->tt_track = 0;
        $templateService->runThroughTemplates($rootlineUtility->get());
        $templateService->generateConfig();
        return (int) $templateService->setup['plugin.']['tx_extension.']['settings.']['pidLoginPage'];
    }

}

Site Configuration (config.yaml)

errorHandling:
  -
    errorCode: '403'
    errorHandler: PHP
    errorPhpClassFQCN: Vendor\Extension\Error\Error403Handler

TypoScript Settings (felogin)

plugin.tx_felogin_pi1 {
    redirectMode = getpost,referer,login,logout
    redirectFirstMethod = 1
    showLogoutFormAfterLogin = 0
}




Kommentare