你如何 return 来自 CakePHP AuthComponent 的自定义错误?

How do you return custom errors from CakePHP AuthComponent?

我目前正在按照此处列出的文档向现有 CakePHP 应用程序添加 CakePHP 3 身份验证组件:

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

我目前正在处理错误信息的显示,按照这个例子:

https://book.cakephp.org/3/en/controllers/components/authentication.html#identifying-users-and-logging-them-in

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'));
        }
    }
}

我正在按照此处的文档集成身份验证组件,如果用户能够通过身份验证,则返回一组用户数据,如果不能(如文档中指定),则返回 false:

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;
    }
}

并在 flash 消息中打印动态产生的错误,如下所示:

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 应该如何运作的意图,我有兴趣对此进行解释和/或知道任何其他正确的方法来做到这一点?

提前致谢!

没有一种公开错误详细信息的方式过于简洁,整个身份验证组件从未专门设计用于 return 故障详细信息。

有很多方法可以解决这个问题,最简单的方法可能是获取特定的身份验证对象,并通过 public API 访问该对象存储的错误,它会需要实施,即您的身份验证器可以例如公开一个 getError() 方法,然后您可以在您的控制器中这样做:

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

对于稍微复杂一点的东西,您可以实现一个 custom/extended 身份验证组件,您可以在其中访问完整的身份验证对象列表,并且可以轻松访问链中的最后一个和 return它包含的可能的错误信息。

如果您要在尚未使用任何身份验证的应用程序中实施身份验证,那么我非常、非常强烈地建议您放弃已弃用的身份验证组件,并使用新的 authentication plugin instead! It's way cleaner and much more versatile, and returning error details开箱即用。