торт php 4 - аутентификация 2 - Как отобразить сообщение, когда не опознано - PullRequest
0 голосов
/ 29 марта 2020

Я использую плагин аутентификации (2) с cakephp4. Я установил:

        'unauthenticatedRedirect' => '/users/login',

, чтобы перенаправить запросы, требующие аутентификации. Это прекрасно работает.

Но я бы хотел добавить сообщение, например, fla sh, которое бы гласило: «Вы должны войти, чтобы получить доступ к этой странице».

Есть ли простой способ сделать это?

Спасибо

1 Ответ

1 голос
/ 30 марта 2020

Для этого пока нет никакой специфической 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.');
    }
}
...