2

这是一个简单的 CakePHP 登录函数(示例取自 CakePHP 食谱):

public function login() {
    if ($this->request->is('post')) {
        if ($this->Auth->login()) {
            return $this->redirect($this->Auth->redirectUrl());
        } else {
            $message = 'Username or password is incorrect';
            $this->Session->setFlash(__($message), 'default', array(), 'auth');
        }
    }
}

在测试此登录功能期间,我发现:

if ($this->Auth->login()) {
    // ...
}

即使之前已完成授权,它也允许用户登录。例如,如果我以User1身份登录并且没有调用注销功能,我正在尝试以User2身份登录- 我将收到下一个错误:

Notice (8): Undefined index: User [APP/Controller/UsersController.php, line 83]

在这种情况下,我可以向用户隐藏登录表单。这是正确的方法吗?

更新:您对下一个代码段有什么看法:

public function login() {
    if ($this->request->is('post')) {
        if ($this->Auth->loggedIn()) {
            $this->Auth->logout();
        }
        if ($this->Auth->login()) {
            return $this->redirect($this->Auth->redirectUrl());
        } else {
            $message = 'Invalid login or password';
            $this->Session->setFlash(__($message), 'default', array(), 'auth');
        }
    }
}
4

2 回答 2

4

教程中的简单 Acl 控制应用程序 - 第 2 部分建议您使用SessionComponent.

您还可以使用AuthComponent来检查用户是否已经登录。$this->Auth->user()在您的控制器中使用。您还可以将键传递给第一个参数以获取表的特定列users或跳过它以获取所有用户信息。Null如果用户未登录或密钥不存在,则返回。

您的登录方法可能如下所示(使用加号标记的添加项+SessionComponent

public function login() {
+   if ($this->Session->read('Auth.User')) {
+       $this->Session->setFlash('You are logged in!');
+       return $this->redirect($this->Auth->redirectUrl());
+   }
    if ($this->request->is('post')) {
        if ($this->Auth->login()) {
            return $this->redirect($this->Auth->redirectUrl());
        } else {
            $message = 'Username or password is incorrect';
            $this->Session->setFlash(__($message), 'default', array(), 'auth');
        }
    }
}
于 2013-08-30T19:28:37.363 回答
0

好吧,这可能是一个简单的修复 - 在您的登录控制器函数中,您可以检查是否设置了会话变量 IsUserLoggedIn。如果不是,则设置它,然后继续身份验证过程,否则,重定向到某个消息页面。

public function login() {
    if ($this->request->is('post')) {

        //check to see if user is logged in.
        if(isset($this->Session->read('IsUserLoggedIn'))) {
        ##perform redirection to "Already Logged In" message
        }

        if ($this->Auth->login()) {
            //write the IsLoggedIn variable to the session.
            $this->Session->write('IsUserLoggedIn', true);

            return $this->redirect($this->Auth->redirectUrl());
        } else {
            $this->Session->setFlash(__('Username or password is incorrect'), 'default',  array(), 'auth');
        }
    }
}

并在注销时删除此会话变量:

  $this->Session->delete('IsUserLoggedIn');

编辑:将会话写入移动到 auth 块内。

于 2013-08-15T13:53:12.163 回答