Typo3 v11 oraz obsługa błędu 403
Tym razem chcemy podzielić się naszym rozwiązaniem, które jest bardzo przydatne jeśli dana strona w CMS TYPO3 wymaga wcześniejszego zalgowania, czyli musimy być zalgowani jako użytkownik FE. Sam CMS daje nam wiele możliwości w jaki sposób możemy możemy zarządzać widocznością stron oraz poszczegółnych elementów strony. W przypadku stron dostęp taki możemy skonfigorować w zakładce "ACCESS"
Mamy tu do wyboru 3 możliwości
- "Hide at login" - strona lub element treści nie ukryty jeśli użytkownik nie będzie zalogowany jako FE
- "Show at any login" - strona lub element treści będzie pokazany jaśli użytkownik będzie zalogowany
- "Usergroup" - tutaj ważna jest już nie tylko to, że użykownik jest zalogowany jako FE ale istotna jest już grupa do której należy. Tręści lub stonny będą pokazane jeśli należy on do jednej lub wiele group
Jeśli nie mamy skonfirowanego żadneg mechanizmu który przekieruje nas do strony logowania, zobaczymy poniższy błąd
Aby to zmienić musimy dodać do Site Configuration obłsugę błędu 403
lub dopsiać poniższy kod do do pliku config/sites/DomainKey/config.yaml
errorHandling: - errorCode: '403' errorHandler: PHP errorPhpClassFQCN: VendorName\MyExtension\PageHandler\NotAuthorized
Kolejnym krokiem jest stworzenie klasy która zajammie się wykonaniem przekierowania do strony gdzie mamy umieszczony formularz logowania. Do takiego url dostanie duklejony parametr referer, który będzie zawierał adres strony do której będziemy zalogowaniu po dokonaniu poprawnej autoryzacji.
<?php declare(strict_types=1); namespace VendorName\MyExtension\PageHandler; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use TYPO3\CMS\Core\Error\PageErrorHandler\PageErrorHandlerInterface; use TYPO3\CMS\Core\Http\RedirectResponse; use TYPO3\CMS\Core\Http\Uri; use TYPO3\CMS\Core\Site\Entity\Site; use TYPO3\CMS\Core\Site\Entity\SiteLanguage; use TYPO3\CMS\Core\Site\SiteFinder; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; class NotAuthorized implements 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']; } }
Ostatnim krokiem jest stworzenie pliku ext_conf_template.txt gdzie musimy podać Id strony gdzie znajduje się formularz logowania
# cat=basic/enable; type=string; label=Login Page loginPage = 97