cakephp 3.0 isAuthorized()没有被调用

时间:2014-12-01 18:19:28

标签: cakephp authorization 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);
    }
}

3 个答案:

答案 0 :(得分:9)

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

您的代码存在的问题是,在UsersController::beforeFilter()方法中,您明确允许所有人访问add方法(甚至不需要身份验证):

$this->Auth->allow(['logout', 'add']);

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

另请注意,您无需手动重定向和设置Flash消息,该组件将为您执行此操作,您只需使用authErrorunauthorizedRedirect选项进行相应配置,见 Cookbook > Components > Authentication > Configuration options

答案 1 :(得分:8)

正如我们关注Cake博客教程, 他们犯了一个小错误,“isAuthorized”功能永远不会被调用。 我确实花了一些时间来研究它。 解决方案是 加载组件“Auth”时添加此行:

'authorize' => array('Controller'),

因此代码看起来像这样:

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

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

答案 2 :(得分:1)

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

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

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