无法通过Auth登录使用CakePHP 2.0

时间:2011-11-06 02:28:00

标签: forms cakephp login authentication

我正在尝试使用CakePHP 2.0获取一个简单的登录表单...只是Auth,现在没有ACL。

我能够看到表单并输入数据库中的电子邮件和密码,但我只是返回到表单并显示flash错误消息。这是我的代码:

AppController的:

 class AppController extends Controller
 {
     function beforeFilter()
     {
         $this->Auth->userModel = 'Users';
         $this->Auth->fields = array('username' => 'email', 'password' => 'password'); //have to put both, even if we're just changing one
         $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
         $this->Auth->loginRedirect = array('controller' => 'hotels', 'action' => 'dashboard');
         $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
     }
 }

login.ctp:

<?php
         echo $this->Form->create('User', array('action' => 'login'));
         echo $this->Form->input('email');
         echo $this->Form->input('password');
         echo $this->Form->end('Login');
     ?>

UsersController:      

 class UsersController extends AppController
 {
     var $name = 'Users';
     var $helpers = array('Html','Form');
     var $components = array('Auth','Session');

     function beforeFilter()
     {
         $this->Auth->allow("logout");
         parent::beforeFilter();
     }

     function index() { } //Redirects to login()

     function login()
     {
         if ($this->Auth->login())
         {
             $this->redirect($this->Auth->redirect());
         } else
         {
             $this->Session->setFlash(__('Invalid username or password, try again'));
         }
     }

     function logout()
     {
         $this->redirect($this->Auth->logout());
     }
 }
 ?>

我感谢任何帮助。谢谢!

7 个答案:

答案 0 :(得分:9)

<无效的用户名或密码,再次尝试“错误会在您登录后显示?

您应该检查一些事项:

$this->Auth->login()的输出是否与数据库中的信息相同?在提交表单后,将debug($this->Auth->login())放在登录方法中查看输出。

•密码是否在数据库中正确散列?

•尝试使AuthComponent可用于所有控制器,而不仅仅是UsersController

•不确定这是否有所不同,但在控制器parent::beforeFilter();方法中的其他任何内容之前调用beforeFilter

修改

看到您正在尝试根据电子邮件和密码进行验证。默认情况下,AuthComponent需要用户名和密码。您必须明确声明您希望$this->Auth->login()验证电子邮件和密码。这来自2.0文档:

public $components = array(
    'Auth'=> array(
        'authenticate' => array(
            'Form' => array(
                'fields' => array('username' => 'email')
            )
        )
    )
);

我相信您没有看到任何SQL输出这一事实。

答案 1 :(得分:6)

此外,您必须检查数据库中的字段“password”是否设置为VARCHAR 50.

在我看来,我在DB中截断了哈希密码而Auth从未发生过。

答案 2 :(得分:2)

如果您没有使用defalut“username”,“password”进行身份验证,则无法登录 例如,您使用“电子邮件”

您应该在包含登录功能的控制器中编辑组件声明:

$component = array('Auth' => array(
  'authenticate' => array(
    'Form' => array(
      'fields' => array('username' => 'email', 'password' => 'mot_de_passe')
    )
  )
));

答案 3 :(得分:1)

对cakephp的惯例很不满意。您应该更改此“$ this-&gt; Auth-&gt; userModel ='Users';”到“$ this-&gt; Auth-&gt; userModel ='用户';”因为没有复数的用户是蛋糕中的模型惯例。这对我有用,也适用于大写字母。它差点让我疯狂。祝你好运。

答案 4 :(得分:0)

public $components = array(
    'Session',
    'Auth' => array(
        'loginRedirect' => array(
            'controller' => 'Events',
            'action' => 'index'
        ),
        'logoutRedirect' => array(
            'controller' => 'Users',
            'action' => 'login',
            'home'
        ),
        'authenticate' => array(
        'Form' => array(
            'fields' => array('username' => 'username','password' => 'password')
        )
    )
    )
);

答案 5 :(得分:0)

在AppController中编辑组件声明对我来说很有用。如果您的字段名称不是&#34;用户名&#34;和#34;密码&#34;你应该总是指定它们。在你的情况下,它将是

public $components = array(
    'Auth' => array(
        'authenticate' => array(
            'Form' => array(
                'passwordHasher' => 'Blowfish',
                'fields' => array('username' => 'email','password' => 'password')
            )
        )
    )
);

答案 6 :(得分:-1)

cakephp教程中有一个错误。 $ this-&gt; Auth-&gt; login()应更改为 $这 - &GT; Auth-&GT;登录($这 - &GT;请求 - &GT;数据)