如何从CakePHP AuthComponent返回自定义错误?

时间:2020-04-20 18:35:36

标签: php authentication cakephp cakephp-3.x

我目前正在按照此处列出的文档向现有的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'));
        }
    }
}

我正在按照此处的文档集成auth组件,其中如果用户能够通过身份验证,则返回一组用户数据,如果用户无法通过身份验证,则返回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应该如何工作的意图,那么我想对此进行解释和/或知道执行此操作的任何其他正确方法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

公开错误细节并没有太干净的方法,整个auth组件从来没有专门设计来返回失败细节。

有很多方法可以解决此问题,最简单的方法可能是获取特定的身份验证对象,并通过需要实现的公共API访问对象存储的错误,例如,您的身份验证者可以公开一个getError()方法,那么您可以在控制器中进行如下操作:

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

对于稍微复杂一点的事情,您可以实现一个自定义/扩展的身份验证组件,在其中您可以访问身份验证对象的完整列表,并且可以轻松访问链中的最后一个对象并返回其保存的可能的错误信息。 / p>

如果您要在尚未使用任何身份验证的应用程序中实现身份验证,那么我非常非常强烈建议您放弃已弃用的身份验证组件,而改用新的authentication plugin!它更干净,用途更广,并且returning error details可以立即使用。