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



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

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

我有一个工作系统,为了防止访问,我在AppController中做了一个检查,以便所有请求首先检查我的会话是否存在:

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

布局位工作得很好所以它理解会话,但它不显示我的客户端登录视图,它有一个简单的登录表单,所以它没有正确地做渲染。知道为什么吗?如果会话不存在,还有更好的方法来显示整个站点的所有操作的布局和视图吗?

'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('*');
    }
}

试试这个:会话->读取("客户")){//客户端会话存在}其他{//客户端会话不存在}

对于这种情况,我通常使用基本http身份验证使用基本身份验证保护内容

你在。htaccess中添加了以下指令,它位于你的app文件夹上面的目录中(更多选项请阅读1)

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

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

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

最新更新