【问题标题】:cakephp 4 - Authentication component not found when bake a new controllercakephp 4 - 烘焙新控制器时找不到身份验证组件
【发布时间】:2020-03-13 17:28:05
【问题描述】:

我无法使用蛋糕烘焙,我有一个与身份验证组件相关的错误。 应用程序使用此组件。 我错过了什么?

这是完整的日志:

bin/cake bake controller styles                                         1 ↵
Baking controller class for Styles...

Creating file /opt/applications/p35/src/Controller/StylesController.php
Wrote `/opt/applications/p35/src/Controller/StylesController.php`
Bake is detecting possible fixtures...
Exception: The request object does not contain the required `authentication` attribute
In [/opt/applications/p35/vendor/cakephp/authentication/src/Controller/Component/AuthenticationComponent.php, line 141]

2020-03-13 18:20:25 Error: [Exception] The request object does not contain the required `authentication` attribute in /opt/applications/p35/vendor/cakephp/authentication/src/Controller/Component/AuthenticationComponent.php on line 141
Stack Trace:
- /opt/applications/p35/vendor/cakephp/authentication/src/Controller/Component/AuthenticationComponent.php:229
- /opt/applications/p35/src/Controller/AppController.php:82
- /opt/applications/p35/vendor/cakephp/cakephp/src/Controller/Controller.php:212
- /opt/applications/p35/vendor/cakephp/bake/src/Command/TestCommand.php:339
- /opt/applications/p35/vendor/cakephp/bake/src/Command/TestCommand.php:245
- /opt/applications/p35/vendor/cakephp/bake/src/Command/TestCommand.php:120
- /opt/applications/p35/vendor/cakephp/bake/src/Command/ControllerCommand.php:201
- /opt/applications/p35/vendor/cakephp/bake/src/Command/ControllerCommand.php:147
- /opt/applications/p35/vendor/cakephp/bake/src/Command/ControllerCommand.php:64
- /opt/applications/p35/vendor/cakephp/cakephp/src/Console/BaseCommand.php:175
- /opt/applications/p35/vendor/cakephp/cakephp/src/Console/CommandRunner.php:336
- /opt/applications/p35/vendor/cakephp/cakephp/src/Console/CommandRunner.php:171
- /opt/applications/p35/bin/cake.php:12

谢谢

还有AppController.php的第82行,在公共函数initialize()中

76    $this->loadComponent('Authentication.Authentication',[
77              'requireIdentity'=>true,
78              'logoutRedirect' => '/users/login']);
79
80
81    $this->user=$this->Authentication->getIdentity();
82        $result = $this->Authentication->getResult();
83        if ($result->isValid()) {
84          $identity=$this->Authentication->getIdentity();
85
            ...

【问题讨论】:

  • 您使用的是哪个版本的身份验证插件?如果不确定,请在 composer.lock 文件中查找 "cakephp/authentication"
  • 还有你的AppController 中的82 行到底是做什么的,它位于什么上下文中?
  • "name": "cakephp/authentication", "version": "2.1.0", grep authentication composer.json "cakephp/authentication" : "^2.0",
  • 我已经用第 82 行更新了最初的帖子
  • 从父级调用它的位置来看,我假设代码在控制器initialize() 方法中?

标签: authentication cakephp cakephp-bake cakephp-4.x


【解决方案1】:

烘焙控制器测试时,烘焙将创建相关控制器类的实例,以便检索该控制器的默认模型,它使用该模型来计算相关夹具,该夹具被添加到 $fixtures 属性生成的控制器测试用例。

当实例化一个控制器时,它的initialize() 方法将在构造时被调用,这就是你的问题开始的地方。您在控制器 initialize() 方法中调用 $this->Authentication->getResult(),导致身份验证组件在附加到控制器的请求对象中查找所需的身份验证数据,果然它不会找到任何此类数据,因为没有身份验证发生了。

您应该将调用身份验证组件的逻辑移到控制器beforeFilter()回调方法中,该方法默认仅在控制器工厂或异常渲染器调用控制器startupProcess()方法时运行,通常是在实际的 HTTP 请求上下文中,或者在可以提供可能需要的身份验证数据的单元测试的上下文中。

另见

【讨论】:

  • 谢谢你的解释,很清楚,解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多