0

我们正在使用 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');
}

我们做错了什么?

4

3 回答 3

2

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

if($this->Session->read('Auth.User.role') != 'admin')
    {
        $this->Session->setFlash('You are not authorized to visit this page');
        $this->redirect('/');
    }
于 2015-03-28T22:31:49.803 回答
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
  }
}

我希望这有帮助

于 2013-04-26T00:19:43.763 回答
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('/');
            }
于 2013-10-19T14:42:16.743 回答