cakephp 3.0 isAuthorized()没有被调用

var*_*s91 1 authorization cakephp cakephp-3.0

我已经按照教程和所有CakePHP授权指南,我无法调用我的isAuthorized()方法.我的理解(纠正我,如果我错了,这是令人难以置信的可能)是通过委派做授权给特定的控制器'authorize'->['Controller']AppController.php,当UsersController的方法被调用,在这种情况下,"添加",UsersController将运行isAuthorized()我定义的方法.我正在测试看看这个方法是否在isAuthorized()调用时输出flash->错误消息,但没有任何反应.如果我明确地调用isAuthorized($hardcodeduser)我的beforeFilter()方法它将工作,但只有我硬编码用户.

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

任何帮助或建议或其他链接将非常感谢!

class AppController extends Controller {

    public $components = ['Flash', 'Auth', 'Session'];

    public function initialize() {

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

        ]);
    }

    public function beforeFilter(Event $event) {
        $this->Auth->authorize = 'Controller';
    }

    public function isAuthorized($user) {

        if(isset($user['is_staff']))
            return true;

        return false;
    }
}


class UsersController extends AppController {

    public function beforeFilter(Event $event) {
        parent::beforeFilter($event);
        $this->Auth->allow(['logout']);
    }

    public function isAuthorized($user) {

        $this->Flash->error(__('Test Message PLEASE WORK'));
        if($this->request->action === 'add') {
            $isStaff = $user['is_staff'];
            if($isStaff == 0) {
                $this->redirect($this->Auth->redirectUrl());
                $this->Flash->error(__('Not authorized to access this function'));  
                return false;
            }
        }
        return parent ::isAuthorized($user);
    }
}
Run Code Online (Sandbox Code Playgroud)

ndm*_*ndm 9

通常,您的假设是正确的,Controller::isAuthorized()将在使用控制器授权处理程序时自动调用.

代码的问题在于,在您的UsersController::beforeFilter()方法中,您明确允许add每个人访问该方法(它甚至不需要身份验证):

$this->Auth->allow(['logout', 'add']);
Run Code Online (Sandbox Code Playgroud)

您必须了解,一旦允许方法,auth组件将不再进行进一步检查,请参阅AuthComponent :: startup().

另请注意,您无需手动重定向和设置Flash消息,组件将为您执行此操作,您只需使用authErrorunauthorizedRedirect选项进行相应配置,请参阅Cookbook>组件>身份验证>配置选项


小智 8

当我们关注Cake博客教程时,他们犯了一个小错误,从未调用过"isAuthorized"函数.我确实花了一些时间来研究它.解决方案是在加载组件"Auth"时添加此行:

'authorize' => array('Controller'),
Run Code Online (Sandbox Code Playgroud)

所以代码看起来应该是这样的:

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

希望它有助于节省一些时间:)