CakePHP 3 - PagesController上

时间:2017-06-13 12:29:01

标签: php cakephp authorization cakephp-3.0 cakephp-3.x

我的管理中心页面当前位于PagesController(称为admin)中。但是,未登录的用户和非管理员用户都可以访问此中心页面,即使他们无法访问该中心的所有链接。

编辑:我刚刚意识到它可能无法正常工作,因为" admin"不是PagesController中的一个函数,而是属于" display"。

我的AppController如下:

public function initialize()
{
    parent::initialize();

    $this->loadComponent('RequestHandler');
    $this->loadComponent('Flash');
    $this->loadComponent('Auth',[
        'authorize' => 'Controller',
    ]);

    $this->Auth->allow(['display']);
}

public function beforeFilter(Event $event)
{
    $this->Auth->deny(['admin']);

}

我的PagesController如下:

public function initialize()
{
    parent::initialize();
    $this->Auth->deny(['admin']);
}

public function isAuthorized($user)
{
    if (in_array($this->request->action,['admin'])) {
        return (bool)($user['role_id'] === 1); //where role_id = 1 refers to an admin
    }
    return parent::isAuthorized($user);
}

2 个答案:

答案 0 :(得分:1)

Auth-> deny()函数用于防止未经授权的用户访问操作。另一方面,Auth-> allow()函数是为公众提供对特定(或所有)操作的访问权。

请阅读此处的文档:https://book.cakephp.org/3.0/en/controllers/components/authentication.html#making-actions-require-authorization

要使Auth组件按需运行,请阅读以下内容:假设您有一个不同的管理员用户数据库表,并且您想要访问者访问受限页面的凭据,您可以执行以下操作:

在AppController中,当用户访问受限页面时,或者在用户访问PagesController的情况下,加载Auth组件并确保在Auth组件中定义了admin用户表,或者在命名时遵循Cakephp约定表

在AppController中

 public function initialize()
 {
    parent::initialize();
    if ($this->request->params["controller"] == 'Pages') {
        $this->loadComponent('Auth', [
                'loginAction' => [
                    'controller' => 'Access',
                    'action' => 'admin_login',
                    'plugin' => 'Access'
                ],
                'loginRedirect' => [
                    'controller' => 'Access',
                    'action' => 'admin_index',
                    'plugin' => 'Access'
                ],
                'authenticate' => [
                    'Form' => [
                    'userModel' => 'your-admin-database-table'
                ]
            ]
           ]);
    }
}

在PagesController中,您需要以下内容:

public function initialize()
{
    parent::initialize();
}

loginAction - 用于管理员登录。 loginRedirect - 登录后登陆管理员用户的位置。 authenticate - 用于定义表单详细信息,例如数据库名称和字段。

可以在此处找到非常详细的文档:https://book.cakephp.org/3.0/en/controllers/components/authentication.html

编辑:请注意,代码尚未经过测试

答案 1 :(得分:0)

您正在检查操作,而不是前缀。 Documentation表明你想要的是

if ($this->request->getParam('prefix') === 'admin')