2014-03-13 58 views
1

我正在为我的妈妈开发一个简单的登录应用程序,其中包含蛋糕2.4。这里是用户模型的代码。CakePHP 2.4 Auth-> login()总是返回FALSE

App::uses('SimplePasswordHasher', 'Controller/Component/Auth'); 

class User extends AppModel{ 
     public $validate = array(
       'username' => array(
         'required' => array(
           'rule' => array('notEmpty'), 
           'message' => 'A username is required' 
         ) 
       ), 
       'password' => array(
         'required' => array(
           'rule' => array('notEmpty'), 
           'message' => 'A password is required' 
         ) 
       ) 
     ); 

     public function beforeSave($options = array()) { 
       if(isset($this->data[$this->alias]['password'])) { 
         $passwordHasher = new SimplePasswordHasher(); 
         $this->data[$this->alias]['password'] = $passwordHasher->hash(
         $this->data[$this->alias]['password'] 
         ); 
       } 
       return true; 
     } 
} 

我UsersController代码...

class UsersController extends AppController{ 
     public $helpers = array('Html','Form'); 

     public function beforeFilter(){ 
       parent::beforeFilter(); 
       $this->Auth->allow('add'); 
     } 
     public function add(){ 
       if($this->request->is('post')){ 
         $this->User->create(); 
         if($this->User->save($this->request->data)){ 
           $this->Session->setFlash(__('The user has been saved')); 
           return $this->redirect(array('action' => 'index')); 
         } 
         $this->Session->setFlash(__('The user could not be saved. Please, try again.')); 
       } 
     } 
     public function login(){ 
       $this->layout = 'mlayout'; 
       if($this->request->is('post')){ 
         debug($this->Auth->login()); 
         var_dump($this->request->data); 
         if($this->Auth->login()){ 
           $this->Session->setFlash('Logged In'); 
           //return $this->redirect($this->Auth->redirectUrl()); 
         }else{ 
           $this->Session->setFlash(__('Usuario o Contraseña invalido, intentelo de nuevo.')); 
         } 
       } 
     } 
     public function logout(){ 
       return $this->redirect($this->Auth->logout()); 
     } 
} 

的AppController代码:

class AppController extends Controller{ 

     public $components = array('Session', 
       'Auth' => array(
         'loginRedirect' => array(
           'controller' => 'homes', 
           'action' => 'index' 
         ), 
         'logoutRedirect' => array(
           'controller' => 'homes', 
           'action' => 'index' 
         ), 
         'authorize' => 'controller' 
       ) 
     ); 

     public function beforeFilter(){ 
       $this->Auth->allow('index','view','login'); 
     } 
} 

Login.ctp

<table id="formtable"> 
    <form id="UserForm" method="post" action="/mercadito/users/login"> 
     <tr> 
     <td align="right">Login -> </td> 
     <td><input type="text" name="username" style="width: 150px; height: 30px;"/></td> 
     </tr> 
     <tr> 
     <td align="right">Contraseña -> </td> 
     <td><input type="password" name="password" style="width: 150px; height: 30px;"/></td> 
     </tr> 
     <tr> 
     <td></td> 
     <td align="center"><input type="submit" value="ENTRAR" style="width: 100px; height: 30px;"/></td> 
     </tr> 
    </form> 
</table> 

debug($this->Auth->login()) returns: /app/Controller/UsersController.php (line 23) false 

var_dump() returns: array(2) { ["username"]=> string(9) "admin" ["password"]=> string(9) "admin" } 

每次都会发生这种情况。我改变了allow->('login')的位置,然后我检查了密码是否散列好,结果是。但问题依然存在。

+1

注意:如果您已经登录,它也返回false! – mark

+0

是的,前一段时间发生在我身上,尝试注销然后重新登录。 – skywalker

回答

1

您应该使用$这 - >形式 - >输入()方法来创建场,因为Cake期望的字段应该是这样的:

data[User][username] 
data[User][password] 

所以,你的代码应该是这样的:

<?php echo $this->Form->create('User'); ?> 
    <fieldset> 
    <?php 
     echo $this->Form->input('username'); 
     echo $this->Form->input('password'); 
    ?> 
    <?php echo $this->Form->submit(__('Login'));?> 
    </fieldset> 
<?php echo $this->Form->end(); ?> 

我敢打赌,如果你用空密码尝试应该让你,因为它总是隐窝空变量:)

0

尝试在你的

AppController的延长分量变量:


class AppController extends Controller{ 

    public $components = array('Session', 
      'Auth' => array(
       'loginRedirect' => array(
         'controller' => 'homes', 
         'action' => 'index' 
       ), 
       'logoutRedirect' => array(
         'controller' => 'homes', 
         'action' => 'index' 
       ), 
       'authorize' => 'controller' 
       ), 
       'Form' => array(
        'passwordHasher' => array(
         'className' => 'Simple', 
         'hashType' => 'sha256' 
       ) 
      ) 
    ); 
+0

谢谢大家的回应!我尝试了你所说的一切,但仍然一直获得'FALSE'。 :/ – user3394540

0

确保在数据库中的密码它的varchar(40)varchar(40+),因为cakephp的散列算法会产生一串36 characters

0

我不明白你为什么接受了错误的答案。既然你想使用电子邮件地址进行身份验证,您应该更改名称属性,在login.ctp像这样:

<input type="text" name="username" style="width: 150px; height: 30px;"/> 

<input type="text" name="email" style="width: 150px; height: 30px;"/> 
0

我有同样的问题,什么固定它,我正在改变这 - $>别名用户,所以beforeSave()现在看起来像

public function beforeSave($options = array()) { 
if (isset($this->data['User']['password'])) { 
    $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']); 
} 
return true; }