如何为受保护页面定义重定向页面

时间:2013-11-20 10:41:43

标签: typo3

在TYPO3 6.1网站中,我想让编辑人员尽可能轻松地创建受限(fe_groups)页面。没有一个受保护的区域,但是在整个pagetree上有几个受保护的页面。

我想要实现的是,只要页面有一些登录行为/限制并且没有登录有效的fe_user,就会重定向到中央登录页面。

我找到了这篇文章 引用相同问题的TYPO3 - Redirecting to login page when user is not logged in - 但解决方案需要手动设置PID。

我几乎无法相信这样的功能(“基于访问限制设置重定向的目标页面”)不可用。或者它存在,还是在某个路线图上?如果没有,是否有解决方法?

1 个答案:

答案 0 :(得分:2)

这确实是TYPO3中一个很大的缺失功能。问题在于,由于构建TYPO3的方式,很难确定页面是否不存在(404)或禁止访问(403)。我对未完成的扩展做了一些进一步的开发工作,请参阅https://github.com/phluzern/adfc_pagenotfound

在readme.txt中,您将找到所需的配置。它与TYPO3 4.7一起使用,因此在6.1中可能会弃用或删除某些使用的类。如果是这样,请分叉项目,更改它们并发出一些拉取请求,以便我可以更新它。

扩展程序使用自定义参数$ arPid(访问限制pid)。访问受限页面的ID将发送到登录页面。您的登录表单必须能够处理此参数才能重定向,请参阅此处的示例: https://github.com/phluzern/phzldap/blob/master/pi1/class.tx_phzldap_pi1.php#L133

最好使用redirect_url,因为felogin支持它。

<强>更新

与此同时,我正在使用具有以下功能的改进类:

  • 如果禁止访问页面,请使用标准redirect_url参数重定向到登录页面。这允许在使用EXT成功登录后重定向:felogin无需修改,并且还支持说话URL。
  • 如果找不到关于网站当前语言的页面,则重定向到404页面。

代码如下:

<?php

use TYPO3\CMS\Core\Utility\GeneralUtility;

class user_pageNotFound {
    /**
     * Detect language and redirect to 404 error page
     *
     * @param array $params "currentUrl", "reasonText" and "pageAccessFailureReasons"
     * @param \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController $tsfeObj
     */
    public function pageNotFound($params, $tsfeObj) {
        /*
         * If a non-existing page with a RealURL path was requested (www.mydomain.tld/foobar), a fe_group value for an empty
         * key is set:
         * $params['pageAccessFailureReasons']['fe_group'][null] = 0;
         * This is the reason why the second check was implemented.
         */
        if (!empty($params['pageAccessFailureReasons']['fe_group']) && !array_key_exists(null, $params['pageAccessFailureReasons']['fe_group'])) {
            // page access failed because of missing permissions
            header('HTTP/1.0 403 Forbidden');
            $this->initTSFE(1);
            /** @var \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer $cObj */
            $cObj = GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\ContentObject\\ContentObjectRenderer');
            $loginUrl = $cObj->typoLink_URL(array(
                'parameter' => $GLOBALS['TYPO3_CONF_VARS']['FE']['pageNotFound_handling_loginPageID'],
                'useCacheHash' => FALSE,
                'forceAbsoluteUrl' => TRUE,
                'additionalParams' => '&redirect_url=' . $params['currentUrl']
            ));
            TYPO3\CMS\Core\Utility\HttpUtility::redirect($loginUrl);
        } else {
            // page not found
            // get first realurl configuration array (important for multidomain)
            $realurlConf = array_shift($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['realurl']);
            // look for language configuration
            foreach ($realurlConf['preVars'] as $conf) {
                if ($conf['GETvar'] == 'L') {
                    foreach ($conf['valueMap'] as $k => $v) {
                        // if the key is empty (e.g. default language without prefix), break
                        if (empty($k)) {
                            continue;
                        }
                        // we expect a part like "/de/" in requested url
                        if (GeneralUtility::isFirstPartOfStr($params['currentUrl'], '/' . $k . '/')) {
                            $tsfeObj->pageErrorHandler('/index.php?id=' . $GLOBALS['TYPO3_CONF_VARS']['FE']['pageNotFound_handling_redirectPageID'] . '&L=' . $v);
                        }
                    }
                }
            }
            // handle default language
            $tsfeObj->pageErrorHandler('/index.php?id=' . $GLOBALS['TYPO3_CONF_VARS']['FE']['pageNotFound_handling_redirectPageID']);
        }
    }

    /**
     * Initializes a TypoScript Frontend necessary for using TypoScript and TypoLink functions
     *
     * @param int $id
     * @param int $typeNum
     */
    protected function initTSFE($id = 1, $typeNum = 0) {
        \TYPO3\CMS\Frontend\Utility\EidUtility::initTCA();
        if (!is_object($GLOBALS['TT'])) {
            $GLOBALS['TT'] = new \TYPO3\CMS\Core\TimeTracker\NullTimeTracker;
            $GLOBALS['TT']->start();
        }

        $GLOBALS['TSFE'] = GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\Controller\\TypoScriptFrontendController',  $GLOBALS['TYPO3_CONF_VARS'], $id, $typeNum);
        $GLOBALS['TSFE']->sys_page = GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\Page\\PageRepository');
        $GLOBALS['TSFE']->sys_page->init(TRUE);
        $GLOBALS['TSFE']->connectToDB();
        $GLOBALS['TSFE']->initFEuser();
        $GLOBALS['TSFE']->determineId();
        $GLOBALS['TSFE']->initTemplate();
        $GLOBALS['TSFE']->rootLine = $GLOBALS['TSFE']->sys_page->getRootLine($id, '');
        $GLOBALS['TSFE']->getConfigArray();

        if (\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('realurl')) {
            $rootline = \TYPO3\CMS\Backend\Utility\BackendUtility::BEgetRootLine($id);
            $host = \TYPO3\CMS\Backend\Utility\BackendUtility::firstDomainRecord($rootline);
            $_SERVER['HTTP_HOST'] = $host;
        }
    }

}

您需要配置的唯一内容是找不到页面的PID和登录页面:

// ID of the page to redirect to if page was not found
$GLOBALS['TYPO3_CONF_VARS']['FE']['pageNotFound_handling_redirectPageID'] = 4690;
// ID of the page to redirect to if current page is access protected
$GLOBALS['TYPO3_CONF_VARS']['FE']['pageNotFound_handling_loginPageID'] = 5404;