CakePHP:如何要求特定页面的管理员角色?

时间:2013-04-25 22:28:56

标签: php cakephp authorization cakephp-2.0 cakephp-2.3

我们正在使用Auth组件。我们目前能够阻止未登录的用户访问我们的“管理员”页面(adminhome.ctp)。但我们无法弄清楚如何让isAuthorized()阻止非管理员访问该网页。

AppController内部:

public function beforeFilter() {
    $this->Auth->allow('index', 'view', 'login', 'logout', 'display');
    $this->Auth->authorize = array('Controller'); 
    //$this->Auth->autoRedirect = false;
}

public function isAuthorized($user_id) {
    $this->loadModel('User');
    $user = $this->User->findById($this->Auth->user());
    if ( $user['User']['role'] === 'admin') {
        $this->Session->setFlash('isAuthorized');
        return true;
    }
    $this->Session->setFlash('!isAuthorized');
    return false;
}

这里是PagesController中的beforeFilter():

function beforeFilter() {
    $this->Auth->deny('adminhome');
}

我们做错了什么?

3 个答案:

答案 0 :(得分:2)

我刚刚使用了雅利安答案但是我做了一些小改动,这对其他人有帮助:

if($this->Session->read('Auth.User.role') != 'admin')
    {
        $this->Session->setFlash('You are not authorized to visit this page');
        $this->redirect('/');
    }

答案 1 :(得分:1)

我相信你的方式不起作用,因为你应该使用Auth-> deny()来限制对方法的访问,而adminhome不是PagesController中的方法。试试这个:

# in app/controller/PagesController.php
public function display() {
  $page = empty($this->request->params['pass'][0]) ? null : $this->request->params['pass'][0];
  if($page == 'adminhome' || $this->User->isAuthorized()) {
    $this->render($page);
  } else {
    # redirect the user somewhere else
  }
}

我希望这会有所帮助

答案 2 :(得分:0)

您将在用户表中拥有角色字段。特别是动作添加此行

if($this->Session->read('Auht.User.role') != 'admin') {
      ...............................
} 

如果您只想要管理员可以查看某些控制器中的每个操作,例如admincontroller

您可以在beforeRender操作

中的该控制器中添加此代码
if($this->Session->read('Auth.User.role') != 'admin')
            {
                $this->Session->setFlash(You are not authorized to visit this page,'flash',array('alert'=>'info'));
                $this->redirect('/');
            }