如果会话不存在,CakePHP将呈现不同的布局和视图

时间:2011-09-03 11:10:55

标签: php cakephp

我正在构建一个网站,需要一个简单的身份验证系统才能放在我的网站上,这样只有拥有密码的人才能访问它。这与用户和身份验证组件不同,因为它只是为了防止访问,除非你应该这样做。

原因是我有一个客户端预览站点,我只希望他们能够访问它但不能使用内置身份验证,因为他们需要同时查看登录和注销状态,因此使用自定义简单身份验证(请注意,这不需要是安全的)。

我有一个工作系统并阻止访问我在AppController中进行检查,以便所有请求首先检查我的会话是否存在:

public function beforeRender()
{
    if ($this->Session->check('client') != true)
    {
        $this->layout = 'client_login'; 
        $this->render = 'pages/client_login';
    }
}

布局位工作正常所以它理解会话,但它没有显示我的客户端登录视图,它上面有一个简单的登录表单,所以它没有正确地进行渲染。任何想法为什么不呢?如果该会话不存在,还可以显示网站上所有操作的布局和视图。

3 个答案:

答案 0 :(得分:2)

'render'是一个函数,而不是属性。所以你的代码应该是:

$this->render('pages/client_login');

编辑:顺便说一句,这段代码不能放在beforeRender()回调中,因为这会导致无限循环(render()引发beforeRender())。

beforeFilter()肯定会是一个更好的地方。

function beforeFilter()
{
    if ($this->Session->check('client') != true)
    {
        $this->autoRender = false;
        $this->layout = 'client_login';
        $this->render('/pages/client_login');
    }
}

修改

就像在我的评论中解释的那样,当你在使用PagesController的URL上时,在PagesController-> display()方法中显式调用render()会阻止你想要做什么。

重新考虑一下你的需求,我看到两个解决方案。

如果您需要一种简单的方法来完全保护您的网站,而无需修改您的应用程序代码,您可以使用Apache通过.htaccess保护访问。在您的情况下,基本身份验证或IP或域上的过滤器可能可以做到这一点。见http://httpd.apache.org/docs/2.0/howto/auth.html

如果您想使用Cake,因为您已经有自定义身份验证系统可以填充会话,那么您可以使用Auth组件来授予或拒绝访问权限。在AppController中,您可以使用以下内容:

function beforeFilter()
{
    $this->Auth->loginAction = '/pages/client_login';

    if($this->Session->check('client'))
    {
        $this->Auth->allow('*');
    }
}

答案 1 :(得分:0)

试试这个: Session-> read('client')){    //客户端会话存在 } 其他{    //客户端会话不存在 }

答案 2 :(得分:0)

对于这种情况,我通常使用Basic http身份验证 Protecting content with basic authentication

在.htaccess中添加以下指令,该指令位于app文件夹上方的目录中(有关更多选项,请阅读1

AuthUserFile    /path/to/your/folder/.htpasswd
AuthGroupFile   /dev/null
AuthName    Administration
AuthType    Basic

使用登录/密码配对在同一目录中创建.htpasswd文件,使用下面的工具

http://www.htaccesstools.com/htpasswd-generator/