Как вы возвращаете пользовательские ошибки из Cake PHP AuthComponent? - PullRequest
0 голосов
/ 20 апреля 2020

Я в настоящее время добавляю компонент аутентификации Cake PHP 3 к существующему приложению Cake PHP, следуя документации, перечисленной здесь:

https://book.cakephp.org/3/en/controllers/components/authentication.html

В настоящее время я работаю с отображением сообщений об ошибках, следуя этому примеру:

https://book.cakephp.org/3/en/controllers/components/authentication.html#identifying -пользователи-и-вход-их-в

public function login()
{
    if ($this->request->is('post')) {
        $user = $this->Auth->identify();
        if ($user) {
            $this->Auth->setUser($user);
            return $this->redirect($this->Auth->redirectUrl());
        } else {
            $this->Flash->error(__('Username or password is incorrect'));
        }
    }
}

Я интеграция компонентов аутентификации, следуя приведенной здесь документации, где массив пользовательских данных возвращается, если пользователь может пройти аутентификацию, и ложь, если они не (как указано в документации):

https://book.cakephp.org/3/en/controllers/components/authentication.html#creating -custom-authentication-objects

namespace App\Auth;

use Cake\Auth\BaseAuthenticate;
use Cake\Http\ServerRequest;
use Cake\Http\Response;

class OpenidAuthenticate extends BaseAuthenticate
{
    public function authenticate(ServerRequest $request, Response $response)
    {
        // Do things for OpenID here.
        // Return an array of user if they could authenticate the user,
        // return false if not.

        if($failureCondition) {
            return false;
        }

        return $user;
    }
}

Однако я хотел бы динамически определить ошибку в компоненте auth:

namespace App\Auth;

use Cake\Auth\BaseAuthenticate;
use Cake\Http\ServerRequest;
use Cake\Http\Response;

class OpenidAuthenticate extends BaseAuthenticate
{
    public function authenticate(ServerRequest $request, Response $response)
    {
        if($failureConditionA) {
            $this->error = 'Error A'; 
            return false;
        }

        if($failureConditionB) {
            $this->error = 'Error B'; 
            return false;
        }

        return $user;
    }
}

И распечатать динамически создаваемую ошибку в fla sh сообщение примерно так:

public function login()
{
    if ($this->request->is('post')) {
        $user = $this->Auth->identify();
        if ($user) {
            $this->Auth->setUser($user);
            return $this->redirect($this->Auth->redirectUrl());
        } else {
            // 'Error A' or 'Error B' displayed on failure
            $this->Flash->error($this->Auth->error());
        }
    }
}

Какой правильный код использовать для этого?

Если это нарушает намерение, как должен функционировать AuthComponent, я бы быть заинтересованным иметь этот опыт выспались и / или знаете какие-нибудь другие правильные способы сделать это?

Заранее спасибо!

1 Ответ

1 голос
/ 20 апреля 2020

Не существует слишком чистого способа раскрытия подробностей об ошибках, весь компонент компонента проверки подлинности никогда не был специально разработан для возврата сведений об ошибках.

Существует множество способов решения этой проблемы, самый простой из которых, вероятно, заключался бы в получении специфицированный c объект аутентификации и доступ к ошибкам, которые объект хранит через API-интерфейс publi c, который он должен будет реализовать, ie ваш аутентификатор может, например, предоставить метод getError(), тогда вы можете что-то вроде это в вашем контроллере:

$openIdAuth = $this->Auth->getAuthenticate('Openid');
$error = $openIdAuth->getError();

Для чего-то более сложного вы можете реализовать пользовательский / расширенный компонент аутентификации, где у вас есть доступ к полному списку объектов аутентификации и вы можете легко получить доступ к последнему в цепочка и возвращает информацию о возможных ошибках, которые он содержит.

Если вы внедряете аутентификацию в приложение, которое еще не использует аутентификацию, тогда я очень и очень настоятельно рекомендую отказаться от устаревшего компонента аутентификации. , и используйте вместо этого новый плагин аутентификации ! Он намного чище и намного более универсален, и возвращает подробности об ошибках поддерживается "из коробки".

...