你如何 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
我目前正在处理错误信息的显示,按照这个例子:
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:
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开箱即用。
我目前正在按照此处列出的文档向现有 CakePHP 应用程序添加 CakePHP 3 身份验证组件:
https://book.cakephp.org/3/en/controllers/components/authentication.html
我目前正在处理错误信息的显示,按照这个例子:
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:
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开箱即用。