You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TYPO3的ActionController中关闭认证实现公开访问

关闭TYPO3 ActionController的强制认证机制

问题描述

我正在开发一个TYPO3插件,通过ActionController类实现相关动作。但ActionController基类默认强制要求认证,而该控制器需渲染公开可访问的页面,无需认证。请问如何关闭该控制器的认证机制?

控制器代码示例

<?php

namespace Homeinfo\SysMon2\Controller;

use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Extbase\Utility\DebuggerUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;

use Generator;

use Homeinfo\hwdb\Domain\Model\Deployment;
use Homeinfo\hwdb\Domain\Repository\DeploymentRepository;
use Homeinfo\hwdb\Domain\Repository\SystemRepository;

use Homeinfo\SysMon2\Domain\Repository\CheckResultsRepository;
use Homeinfo\SysMon2\SystemWithCheckResults;

class UnauthenticatedAccess extends ActionController
{
    public function systemDetailsAction()
    {
        //$customerId = $this->request->getArgument('customer');
        $customerId = 1030020;
        $deploymentRepository = GeneralUtility::makeInstance(ObjectManager::class)
            ->get(DeploymentRepository::class);
        $deployments = iterator_to_array($deploymentRepository->findByCustomerId($customerId));
        $systemRepository = GeneralUtility::makeInstance(ObjectManager::class)
            ->get(SystemRepository::class);
        $deploymentIds = [];
        
        foreach ($deployments as &$deployment)
            $deploymentIds[] = $deployment->id;

        $systems = iterator_to_array($systemRepository->findByDeploymentIds($deploymentIds));
        $checkResultsRepository = GeneralUtility::makeInstance(ObjectManager::class)
            ->get(CheckResultsRepository::class);
        $systemIds = [];
            
        foreach ($systems as $system)
            $systemIds[] = $system->id;

        $checkResults = iterator_to_array($checkResultsRepository->findLastMonthBySystems($systemIds));
        $systemsWithCheckResults = iterator_to_array(
            SystemWithCheckResults::fromSystemsDeploymentsAndCheckResults($systems, $deployments, $checkResults)
        );
        $this->view->assign('systemsWithCheckResults', $systemsWithCheckResults);
    }
}

解决方案

针对TYPO3中ActionController的认证问题,有几种可靠的解决方式:

1. 通过TypoScript配置取消认证

在插件对应的TypoScript配置中,为目标控制器的指定动作关闭认证要求:

plugin.tx_sysmon2 {
    controllers {
        UnauthenticatedAccess {
            actions {
                systemDetails {
                    requireAuthentication = 0
                }
            }
        }
    }
}

2. 重写控制器的初始化方法

在你的UnauthenticatedAccess控制器中,重写initializeAction方法,跳过父类的认证逻辑:

protected function initializeAction()
{
    // 不调用parent::initializeAction(),跳过默认认证检查
    // 可根据需求添加自定义初始化逻辑
}

3. 替换父类为AbstractController

如果控制器不需要ActionController的额外功能,可以直接继承AbstractController,它没有默认的强制认证机制:

use TYPO3\CMS\Extbase\Mvc\Controller\AbstractController;

class UnauthenticatedAccess extends AbstractController
{
    // 保留原有的动作方法
}

4. 设置控制器的认证属性

在部分TYPO3版本中,可直接在控制器类中定义属性关闭认证:

class UnauthenticatedAccess extends ActionController
{
    protected $authenticationRequired = false;

    // 原有的动作方法
}

注意事项

  • 公开访问的控制器动作需避免处理敏感操作,防止安全风险
  • 不同TYPO3版本对配置或属性的支持可能有差异,需结合实际版本测试验证

内容的提问来源于stack exchange,提问作者user3515670

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:35:00