2009-04-20 164 views
4

我想使用isAuthorized()方法来检查管理标志,但函数似乎永远不会被调用。即使我将函数设置为始终返回false,它也允许任何用户。它看起来好像没有被调用。cakephp isAuthorized()没有被调用

我需要做更多的事情吗?设置$ this-> Auth-> authorize ='controller'?

从/app/app_controller.php

class AppController extends Controller 
{ 

var $components = array('Auth'); 

function beforeFilter() 
{ 
    $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login'); 
    $this->Auth->loginRedirect = array('controller' => 'pages', 'display' => 'home'); 
    $this->Auth->logoutRedirect = '/'; 
    $this->Auth->authorize = 'controller'; 
    $this->Auth->userScope = array('User.active' => 1); 
} 

function isAuthorized() 
{ 
    if (strpos($this->action, "admin_") != false) 
    { 
     if ($this->Auth->user('isAdmin') == '0') 
     { 
      return false; 
     } 
    } 
    return true; 
} 
} 

回答

12

你应该检查你是否覆盖你的其他控制器的Auth设置。

首先,为了验证isAuthorized()正在被调用,请尝试在其中放入一个简单的debug($this); die;

如果它没有死亡,你可能会在其他控制器中重写它(你错过了parent::isAuthorized()调用)。

如果不是这样,那么你可能会用beforeFilter()做同样的事情。

+1

事实证明我重写beforeFilter()而不是调用parent :: beforeFilter() – 2009-04-22 01:50:36

-4

你需要确保“验证”是组件阵列对于控制器:

$this->components[] = 'Auth'; 

下降,在构造函数和它应该工作(当然,除非它不)。祝你好运!

+0

我忽略它从原来的职位,但在添加它我的编辑,它一直在那里。 – 2009-04-20 15:58:08

1

附加博士汉尼拔的答案,还有一个可能的原因,如果你遇到此问题(像我一样...):

如果控制器被命名为tests_controller,的启动方法Auth-Component在不启动身份验证的情况下中止(至少在cakePHP 1.3.10中 - 未检查2.x)。所以,要确保你从来没有命名控制器tests_controller ...从蛋糕\库

摘录\控制器\分量\ auth.php

function startup(&$controller) { 
    $isErrorOrTests = (
     strtolower($controller->name) == 'cakeerror' || 
     (strtolower($controller->name) == 'tests' && Configure::read() > 0) 
    ); 
    if ($isErrorOrTests) { 
     return true; 
    } 
...