SudoModeRequiredEvent 

The PSR-14 event \TYPO3\CMS\Backend\Backend\Event\SudoModeRequiredEvent is triggered before showing the sudo-mode verification dialog when managing backend user accounts.

This step-up authentication, introduced as part of the fix for TYPO3-CORE-SA-2025-013, helps prevent unauthorized password changes. However, it may pose challenges when using remote single sign-on (SSO) systems, which typically do not support a separate step-up verification process.

This event allows developers to skip / bypass the step-up authentication process and uses custom logic, such as identifying users authenticated through an SSO system.

Example: use an event listener to skip step-up authentication for SSO users 

The following example demonstrates how to use an event listener to skip step-up authentication for be_users records that have an active is_sso flag:

EXT:my_extension/Configuration/Services.yaml
services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  Vendor\MyExtension\EventListener\SkipSudoModeDialog:
    tags:
      - name: event.listener
        identifier: 'ext-myextension/skip-sudo-mode-dialog'
  Vendor\MyExtension\EventListener\StaticPasswordVerification:
    tags:
      - name: event.listener
        identifier: 'ext-myextension/static-password-verification'
Copied!
EXT:my_extension/Classes/EventListener/SkipSudoModeDialog.php
<?php

declare(strict_types=1);

namespace Vendor\MyExtension\EventListener;

use TYPO3\CMS\Backend\Hooks\DataHandlerAuthenticationContext;
use TYPO3\CMS\Backend\Security\SudoMode\Access\AccessSubjectInterface;
use TYPO3\CMS\Backend\Security\SudoMode\Access\TableAccessSubject;
use TYPO3\CMS\Backend\Security\SudoMode\Event\SudoModeRequiredEvent;
use TYPO3\CMS\Backend\Utility\BackendUtility;
use TYPO3\CMS\Core\Utility\MathUtility;

final class SkipSudoModeDialog
{
  public function __invoke(SudoModeRequiredEvent $event): void
  {
    // Ensure the event context matches DataHandler operations
    if ($event->getClaim()->origin !== DataHandlerAuthenticationContext::class) {
      return;
    }

    // Filter for TableAccessSubject types only
    $tableAccessSubjects = array_filter(
      $event->getClaim()->subjects,
      static fn(AccessSubjectInterface $subject): bool => $subject instanceof TableAccessSubject,
    );

    // Abort if there are unhandled subject types
    if ($event->getClaim()->subjects !== $tableAccessSubjects) {
      return;
    }

    /** @var list<TableAccessSubject> $tableAccessSubjects */
    foreach ($tableAccessSubjects as $subject) {
      // Expecting format: tableName.fieldName.id
      if (substr_count($subject->getSubject(), '.') !== 2) {
        return;
      }

      [$tableName, $fieldName, $id] = explode('.', $subject->getSubject());

      // Only handle be_users table
      if ($tableName !== 'be_users') {
        return;
      }

      // Skip if ID is not a valid integer (e.g., 'NEW' records)
      if (!MathUtility::canBeInterpretedAsInteger($id)) {
        continue;
      }

      $record = BackendUtility::getRecord($tableName, $id);

      // Abort if any record does not use SSO
      if (empty($record['is_sso'])) {
        return;
      }
    }

    // All conditions met — disable verification
    $event->setVerificationRequired(false);
  }
}
Copied!

See also: StaticPasswordVerification example

API 

class SudoModeRequiredEvent
Fully qualified name
\TYPO3\CMS\Backend\Security\SudoMode\Event\SudoModeRequiredEvent
getClaim()
Returns
TYPO3CMSBackendSecuritySudoModeAccessAccessClaim
isVerificationRequired()
Returns
bool
setVerificationRequired(bool $verificationRequired)
param $verificationRequired

the verificationRequired