使用' /'的某些路由访问缓存视图时,CakePHP身份验证被忽略

时间:2012-07-23 13:31:36

标签: cakephp authentication caching routes cakephp-1.3

我使用

在控制器的索引操作上设置了视图缓存
class DiaryController extends AppController {
  ...
  var $cacheAction = array('index' => "+56 hours");

  function index($week = null) {
    ...
  }
}

app/config/core.php中包含以下选项:

Configure::write('Cache.check', true);

...

Cache::config('default', array('engine' => 'File'));

日记控制器(以及网站的其余部分!)上的索引操作只应由经过身份验证的用户访问,并使用AuthComponent

class AppController extends Controller {

  ...
  var $components = array('Auth', 'Security', 'Session','Cookie','RequestHandler');

  function beforeFilter() {

    $this->Auth->userModel = 'Admin';
    ...
  }
...
}

我想使用

将网站的根目录映射到我的登录表单
Router::connect('/', array('controller' => 'admin', 'action' => 'login'));
app/config/routes.php中的

。一切似乎都正常,直到我退出然后尝试在浏览器中访问mytestsite.com/diary/index。即使我没有登录,我仍然可以访问这些页面。我认为这是缓存的问题,因为我只能访问app/tmp/cache/views中我有文件的URL。将索引操作的$week参数更改为我没有缓存文件的值,以便生成You are not authorized to access that location.消息。

奇怪的是,如果我将网站的根映射到DiaryController的索引操作,并带有

Router::connect('/', array('controller' => 'diary', 'action' => 'index'));

(再次在app/config/routes.php中)我没有这个问题。当我没有登录时,我无法访问缓存的日记索引视图。

之前有没有人遇到过这个问题?你能说一些我可能错过的东西吗?或者您知道这是否是核心文件中的错误?我正在使用CakePHP 1.3.15。

1 个答案:

答案 0 :(得分:1)

这是一个迟到的响应,但原因是缓存视图操作会绕过所有控制器和组件回调。 Auth组件通过回调来完成它的工作。因此,当您缓存操作时,将忽略这些检查。

你可以通过传递'callbacks'=>来强制回调。 $ cacheAction中的true选项,如下所示:

public $cacheAction = array(
    'index' => array('callbacks' => true, 'duration' => '+56 hours')
);

但这部分地违背了视图缓存的目的,即绕过所有控制器逻辑。

更多信息here