CakePHP验证登录停止工作

时间:2013-07-29 17:37:34

标签: cakephp authentication cakephp-2.2

我的auth组件在过去一年中一直运作良好。大约两个小时前我登录了我的网站并进行了一次小改动。我在这两个小时下车,因为大约一个半小时前我已经回来了,所以我无法登录我的网站。错误消息显示用户名/密码组合不正确。我想我的数据库中的值已经改变了,或者我的浏览器已经自动保存了一个旧密码,所以为了确保我在数据库中使用适当的md5哈希值更新了密码,我在浏览器中再次尝试了。它仍然无效。

我清空我的缓存(这是我经常做的事情)因为我被建议从this post这样做但是这也没有用(也没有帮助那个问题的海报)。那个人在破坏数据库连接的视图文件中添加了一些东西的解决方案不适用于我,因为我没有更改任何视图文件。我也没有改变用户模型或app控制器。在我之前的时间里,我唯一改变的是我编辑了UsersController online()动作。我已经改回来了。实际上,我进入了我的站点备份实用程序并将所有控制器和模型文件恢复到最近的备份,这是2天前所有工作正常时的备份。仍然没有影响。

我无法登录我已注册的任何帐户。我甚至没有在数据库中使用其中一个密码并尝试使用该帐户登录,但这也无效。

AppController的

//I HAVE NOT CHANGED THIS IN SEVERAL MONTHS

public $helpers = array('Form', 'Html', 'Custom', 'Time', 'Js', 'Cache');
public $components = array('CustomPage', 'Session', 'CustomUser',
   'Auth' => array(
        'autoRedirect' => false,
        'loginAction' => array('controller' => 'users', 'action' => 'login', 'prefix' => false, 'admin' => false, 'moderate' => false),
        'loginRedirect' => array('prefix' => false, 'admin' => false, 'moderate' => false, 'controller' => 'account', 'action' => 'index'),
        'logoutRedirect' => array('controller' => 'index', 'prefix' => false, 'admin' => false, 'moderate' => false),
        'authError' => "You can't access that page",
        'authorize' => array('Controller')
    )
); // components

public function isAuthorized($user) {
    return true;
}

UsersController

// DID NOT CHANGE FOLLOWING ACTION

public function login() {
    if ($this->Session->read('Auth.User')) {
        $this->Session->setFlash('You are already logged in');  
        $this->redirect(array('controller' => 'account', 'action' => 'index'));
    }

    $this->layout = "simple";
    $this->set('title_for_layout', 'Login');

    if ($this->request->is('post')) {
        $this->User->UsersOnline->deleteAll(array('UsersOnline.session' => $this->viewVars['session_session']), false);

        if ($this->Auth->login()) { // check user is logged in
            $this->User->id = $this->Auth->user('id');
            $this->User->saveField('last_login', date(Configure::read('Site.date_format'))); // save login time
            $this->redirect($this->Auth->redirect()); // redirect to default place
        } else {
            $this->Session->setFlash('Your username/password combination was incorrect');
        }
    }
} // end login


// THE FOLLOWING ACTION WAS THE ONLY THING
// THAT WAS CHANGED BUT IT IS NOW BACK TO ORIGINAL VERSION

public function online() {
    $page_id = $this->viewVars['page_id'];
    $link = $this->viewVars['link'];

    // CONTAIN
    $this->User->UsersOnline->contain(array(
        'User' => array(
            'fields' => array(
                'User.username', 'User.online'
            ),
            'Avatar' => array(
                'fields' => array(
                    'Avatar.file'
                )
            )
        )
    ));

   if($page_id){
       $this->set('users', $this->paginate($this->User->UsersOnline, array('UsersOnline.page_id' => $page_id)));
       $this->set('title_for_layout', 'Fans Online');
   }
   else{
       $this->set('title_for_layout', 'Users Online');
       $this->set('users', $this->paginate($this->User->UsersOnline));
       $this->layout = "default";
   }    
} // end online action

我的用户模型使用标准的“用户名”和“密码”列来验证用户身份。

我已将以下代码添加到我的UserController login()操作中,并打印出正确的结果...

$password = md5($this->request->data['User']['password']);

print_r(
    $this->User->find('first',
        array(
            'User.username' => $this->request->data['User']['username'],
            'User.password' => $password
        )
    )
);

同样,我已经将所有控制器和模型文件恢复到2天前的状态,所以我真的不知道是什么原因造成的。

编辑1:现在为了安全起见,我将所有视图文件从本周末恢复为最新的备份版本。这并没有解决问题。

编辑2:如果我调试$this->Auth->login,结果为空。如果什么都没有改变,为什么它会突然变空?

编辑3:我的UsersController register()操作正确创建了一个新用户,并自动将该用户登录。

UsersController

public function register() {
    if($this->Session->read('Auth.User')) {
        $this->Session->setFlash('You are already registered');  
        $this->redirect(array('controller' => 'account', 'action' => 'index'));
    }

    $this->layout = "simple";
    $this->set('title_for_layout', 'Register');
    if ($this->request->is('post')) {
            $this->User->create();

            if ($this->User->save($this->request->data)) {
                $id = $this->User->id;
                $this->request->data['User'] = array_merge($this->request->data['User'], array('id' => $id));

                if($this->Auth->login($this->request->data['User'])){
                    $this->Session->setFlash(__('Your account has successfully been created and you have logged in'));
                    $this->redirect(array('controller' => 'account', 'action' => 'index'));
                } // end if account created and successful log in
                else{
                    $this->Session->setFlash(__('Your account has successfully been created but you cannot log in'));
                } // end else if account created but not logged in
            } else {
                $this->Session->setFlash(__('Your account could not be created. Please, try again.'));
        } // end else if account cannot be created
    } // end if method is post
} // end register

2 个答案:

答案 0 :(得分:0)

好吧,我从未弄清楚INITIAL问题是什么,但现在我发现恢复所有已更改的控制器,模型和视图文件似乎解决了这个问题。我不知道我不知道最初的问题是什么。

但是,我发现在我将我的数据库中的所有密码更新为相应的md5哈希之后,这给了我持续的问题。我猜Cake不使用md5我认为密码没有正确匹配。因此,即使在恢复所有已更改的文件后,密码也都变得不正确。

如果我弄清楚原始问题是什么,我会更新。

答案 1 :(得分:0)

删除tmp/cachetmp/models

中的所有文件可能会有所帮助