未调用cakephp 3.0 isAuthorized()

未调用cakephp 3.0 isAuthorized(),cakephp,authorization,cakephp-3.0,Cakephp,Authorization,Cakephp 3.0,我遵循了教程和所有CakePHP授权指南,无法调用我的isAuthorized方法。如果我错了,我的理解会纠正我,这很可能是通过在AppController.php中执行'authorize'->['Controller']将授权委托给特定的控制器,当调用UsersController中的方法时,在本例中为'add',UsersController将运行我定义的isAuthorized方法。我正在测试这个方法是否在调用isAuthorized时输出flash->error消息,但什么也没发生。如

我遵循了教程和所有CakePHP授权指南,无法调用我的isAuthorized方法。如果我错了,我的理解会纠正我,这很可能是通过在AppController.php中执行'authorize'->['Controller']将授权委托给特定的控制器,当调用UsersController中的方法时,在本例中为'add',UsersController将运行我定义的isAuthorized方法。我正在测试这个方法是否在调用isAuthorized时输出flash->error消息,但什么也没发生。如果我在BeforeFilter方法中显式调用isAuthorized$hardcodeduser,它将起作用,但前提是我硬编码用户

该方法的工作方式是:如果注册用户请求添加/创建新用户,系统检查用户是否具有管理员/员工级别的权限,该权限仅为数据库中的0或1值,如果用户没有权限,则系统将重定向到主屏幕,并显示一条错误消息,说明您无权访问该功能

任何帮助或建议或其他链接将不胜感激

类AppController扩展控制器{ public$components=['Flash','Auth','Session']; 公共函数初始化{ $this->loadComponent'Flash'; $this->loadComponent'Auth'[ “授权”=>[“控制器”], “LoginDirect”=>[ “控制器”=>“文章”, '操作'=>'索引' ], “logoutRedirect”=>[ “控制器”=>“页面”, “操作”=>“显示”, “家” ] ]; } FilterEvent$事件前的公共函数{ $this->Auth->authorize='Controller'; } 公共函数已授权$user{ ifisset$user['is_staff'] 返回true; 返回false; } } 类UsersController扩展了AppController{ FilterEvent$事件前的公共函数{ 父::beforeFilter$事件; $this->Auth->allow['logout']; } 公共函数已授权$user{ $this->Flash->error___测试消息请工作'; 如果$this->request->action=='add'{ $isStaff=$user['is_staff']; 如果$isStaff==0{ $this->redirect$this->Auth->redirectUrl; $this->Flash->error__'无权访问此功能'; 返回false; } } 返回父项::已授权$user; } }
通常您的假设是正确的,Controller::isAuthorized将在使用控制器授权处理程序时自动调用

代码的问题在于,在UsersController::beforeFilter方法中,您显式地允许每个人访问add方法,甚至不需要身份验证:

$this->Auth->allow(['logout', 'add']);
您必须了解,一旦允许使用某个方法,auth组件将不会进行进一步的检查,请参阅


还请注意,您不需要手动重定向和设置flash消息,组件将为您执行此操作,您只需使用authError和UnauthorizedDirect选项对其进行适当配置,请参见,Controller::isAuthorized将在使用控制器授权处理程序时自动调用

代码的问题在于,在UsersController::beforeFilter方法中,您显式地允许每个人访问add方法,甚至不需要身份验证:

$this->Auth->allow(['logout', 'add']);
您必须了解,一旦允许使用某个方法,auth组件将不会进行进一步的检查,请参阅


还请注意,您不需要手动重定向和设置flash消息,组件将为您执行此操作,您只需使用authError和UnauthorizedDirect选项对其进行适当配置,请参见我们下面的Cake博客教程, 他们犯了一个小错误,函数被授权了,永远不会被调用。 我确实花了一点时间来研究它。 解决办法是 加载组件身份验证时添加此行:

'authorize' => array('Controller'),
因此,代码应该如下所示:

$this->loadComponent('Auth', [
    'loginRedirect' => [
        'controller' => 'Articles',
        'action' => 'index'
    ],
    'logoutRedirect' => [
        'controller' => 'Pages',
        'action' => 'display',
        'home'
    ],
    'authorize' => array('Controller'),                
]);

希望它能帮助一些人节省时间:

在我们学习Cake博客教程时, 他们犯了一个小错误,函数被授权了,永远不会被调用。 我确实花了一点时间来研究它。 解决办法是 加载组件身份验证时添加此行:

'authorize' => array('Controller'),
因此,代码应该如下所示:

$this->loadComponent('Auth', [
    'loginRedirect' => [
        'controller' => 'Articles',
        'action' => 'index'
    ],
    'logoutRedirect' => [
        'controller' => 'Pages',
        'action' => 'display',
        'home'
    ],
    'authorize' => array('Controller'),                
]);

希望它能帮助您节省时间:

来自cakephp 3.x文档:您可以在控制器的beforeFilter中配置授权处理程序或使用数组初始化方法:

// Basic setup
$this->Auth->config('authorize', ['Controller']);

// Pass settings in
$this->Auth->config('authorize', [
'Actions' => ['actionPath' => 'controllers/'],
'Controller'
]);

从cakephp 3.x文档中:您可以在控制器的beforeFilter或使用数组初始化方法中配置授权处理程序:

// Basic setup
$this->Auth->config('authorize', ['Controller']);

// Pass settings in
$this->Auth->config('authorize', [
'Actions' => ['actionPath' => 'controllers/'],
'Controller'
]);

您的代码中还有几个编码缺陷。其中一个:你忘了
返回重定向,并且以下任何代码都不会执行。正如ndm所提到的,你真的需要把你的基本知识弄清楚。我为这种格式道歉,我以前从来没有在堆栈上发布过,而且复制代码的工作很糟糕,很匆忙。代码块的间距把我搞砸了,我没有意识到它显示得如此糟糕。不被调用的意思是:当调用UsersController函数add时,我的印象是isAuthorized将被自动调用,因为appcontroller中的“authroize”=>“Controller”调用。我希望我的测试消息会显示出来,因为我认为会调用isAuthorized,但除非我在BeforeFilter中显式调用isAuthorized$user,否则不会显示任何消息。您的代码中还有几个编码缺陷。其中之一是:您忘记返回重定向,并且下面的任何代码都不会执行。正如ndm所提到的,你真的需要把你的基本知识弄清楚。我为这种格式道歉,我以前从来没有在堆栈上发布过,而且复制代码的工作很糟糕,很匆忙。代码块的间距把我搞砸了,我没有意识到它显示得如此糟糕。不被调用的意思是:当调用UsersController函数add时,我的印象是isAuthorized将被自动调用,因为appcontroller中的“authroize”=>“Controller”调用。我希望我的测试消息会显示出来,因为我认为会调用isAuthorized,但除非我在BeforeFilterHanks中显式调用isAuthorized$user,否则不会显示任何消息。对于指向AuthComponent::startup的链接,我说得更清楚了。在搜索上述问题的解决方案时,我还没有更改Auth-config选项,但目前我只收到了flash消息,以确保正在调用isAuthorized。我更改了Auth->allow并删除了add,但问题仍然存在。我不知道我到底缺少了什么,或者我是否以某种方式重写了isAuthorized方法,或者可能需要更改任一控制器中的beforeFilter。非常感谢您的回答!我几乎要发疯了,因为没有调用isAuthorized,结果只是我不了解它的实际工作原理。感谢到AuthComponent::startup的链接,让很多事情变得更清楚了。在搜索上述问题的解决方案时,我还没有更改Auth-config选项,但目前我只收到了flash消息,以确保正在调用isAuthorized。我更改了Auth->allow并删除了add,但问题仍然存在。我不知道我到底缺少了什么,或者我是否以某种方式重写了isAuthorized方法,或者可能需要更改任一控制器中的beforeFilter。非常感谢您的回答!我几乎要发疯了,因为我的授权没有被调用,结果只是我不了解它的实际工作原理。他们在教程中注意到了这一点,但我也错过了,这有帮助。他们在教程中注意到了这一点,但我也错过了,这也有帮助