Blog 27.12.2021

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

PHP
Copied!
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
Copied!
<?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

PHP
Copied!
# cat=basic/enable; type=string; label=Login Page
loginPage = 97
O autorze
Krzysztof Napora
Krzysztof Napora
Krzysztof Napora