我正在尝试使用isAuthorized()方法来检查管理标志,但似乎永远不会调用该函数。即使我将函数设置为始终返回false,它也允许任何用户。它似乎没有被调用。
我是否需要做一些事情而不是设置$ 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;
}
}
答案 0 :(得分:12)
您应该检查是否覆盖了其他控制器中的Auth设置。
首先,要验证是否正在调用isAuthorized()
,请尝试在其中添加一个简单的debug($this); die;
。
如果它没有死亡,你可能会在其他控制器中覆盖它(你错过了parent::isAuthorized()
电话)。
如果不是这样,那么你可能会对beforeFilter()
做同样的事情。
答案 1 :(得分:1)
除了Hannibal Lecter博士的答案之外,如果你遇到这个问题还有另一个可能的原因(正如我所做的那样......):
如果您的控制器名为 tests_controller ,则Auth-Component的startUp方法将在不启动身份验证的情况下中止(至少在cakePHP 1.3.10中未检查2.x)。因此,请确保永远不要命名Controller tests_controller ......
摘自cake \ libs \ controller \ components \ auth.php
function startup(&$controller) {
$isErrorOrTests = (
strtolower($controller->name) == 'cakeerror' ||
(strtolower($controller->name) == 'tests' && Configure::read() > 0)
);
if ($isErrorOrTests) {
return true;
}
...
答案 2 :(得分:-4)
您需要确保'Auth'位于该控制器的components数组中:
$this->components[] = 'Auth';
删除它在构造函数中它应该工作(当然,除非它没有)。祝你好运!