如何在用户登录时使某些页面不可用

时间:2009-08-07 03:30:20

标签: php cakephp authentication

在CakePHP中,我们可以使用$this->Auth->allow('someMethod');使页面可以查看而无需登录。当用户登录时,如何使某些相同的页面无法查看?这方面的一个例子是我们想要在没有用户登录的情况下访问的注册页面......但是一旦用户登录就无法访问。

我将$this->Auth->deny('someMethod')放在isAuthorized()中,但在我看来,如果方法位于允许列表中,那么当我们尝试运行该页面时,不会调用isAuthorized

有什么输入?谢谢

3 个答案:

答案 0 :(得分:3)

没有类似Cake Auth内置的复杂规则。你必须手动检查这样的条件。这很简单:

// Controller
function register() {
    if ($this->Auth->user()) {
        $this->redirect(/* somewhere else */);
    }
}

与mlevits回答相反,您不需要在Session中存储任何内容,可以从AuthComponent本身获得信息。 http://book.cakephp.org/view/387/user

还有一个示例如何通过动态使用deny()来做到这一点,但在像这样的恕我直言的简单情况下,这并不是那么清楚。 http://book.cakephp.org/view/383/deny
此外,deny()会生成错误消息(“您无权访问此位置”),这可能不是您在此情况下的用户体验所希望的。

答案 1 :(得分:0)

编辑:

不知道CakePHP使用了不同的语法。

然后,您可以使用以下内容设置会话变量:

$this->Session->write('user_id', '<some_user_name>');

然后使用此选项在用户登录后重定向:

if ($this->Session->check('user_id'))
{
    $this->redirect('http://google.com');
}

然后销毁会话使用:

$this->Session->destroy()

More information about CakePHP Sessions

由于

答案 2 :(得分:0)

您可以在AppController中的beforeFilter方法中检查它,以允许全程检查。例如:

<?php
class AppContoller extends Controller {
    var $components = array('Session', 'Auth');

    function beforeFilter(){
        $this->Auth->allow('register', 'home');
        // Check if current action allowed to access without authorization and User has login
        if(array_key_exists($this->params['action'], $this->Auth->allowedActions) && $this->Auth->user()){
            $this->redirect(/* somewhere else */);
        }
    }
}
?>

当然你也可以在某个控制器而不是AppController中实现它。