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