Для этого пока нет никакой специфической c функциональности: https://github.com/cakephp/authentication/issues/316
Это можно решить разными способами, лично я делал это раньше перехватив Authentication\Authenticator\UnauthenticatedException
в расширенном компоненте аутентификации, переписав \Authentication\Controller\Component\AuthenticationComponent::doIdentityCheck()
:
<?php
// src/Controller/Component/AppAuthenticationComponent.php
/*
load in `AppController::initialize()` via:
$this->loadComponent('Authentication', [
'className' => \App\Controller\Component\AppAuthenticationComponent::class,
]);
*/
namespace App\Controller\Component;
use Authentication\Authenticator\UnauthenticatedException;
use Authentication\Controller\Component\AuthenticationComponent;
use Cake\Controller\Component\FlashComponent;
/**
* @property FlashComponent $Flash
*/
class AppAuthenticationComponent extends AuthenticationComponent
{
public $components = [
'Flash'
];
protected function doIdentityCheck(): void
{
try {
parent::doIdentityCheck();
} catch (UnauthenticatedException $exception) {
$this->Flash->error(__('You must be logged in to access this page.'));
throw $exception;
}
}
}
Вы также можете сделать это вручную в контроллере приложения, для этого вам придется отключить автоматические компоненты компонента плагина c проверка личности, и сделайте эту проверку самостоятельно:
// src/Controller/AppController.php
public function initialize(): void
{
parent::initialize();
$this->loadComponent('Authentication.Authentication', [
'requireIdentity' => false
]);
}
public function beforeFilter(EventInterface $event)
{
parent::beforeFilter($event);
$action = $this->request->getParam('action');
if (
!in_array($action, $this->Authentication->getUnauthenticatedActions(), true) &&
!$this->Authentication->getIdentity()
) {
$this->Flash->error(__('You must be logged in to access this page.'));
throw new UnauthenticatedException('No identity found.');
}
}