CakePHP - 无法使用Blowfish算法进行身份验证

时间:2014-12-23 13:25:32

标签: php cakephp cakephp-2.5

让cakephp对河豚存储密码进行身份验证时遇到一些麻烦。

在AppController中。设置全局组件。用户模型是CompaniesUser,它对应于名为CompaniesUser.php的磁盘上的文件。密码Hasher是Blowfish

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

class AppController extends Controller {
    public $helpers = array('CustomHtml');
    public $components = array(
        'DebugKit.Toolbar',
        'Session',
            'Auth' => array(
                'loginRedirect' => array(
                    'controller' => 'dashboard',
                    'action' => 'something'
                ),
                'logoutRedirect' => array(
                    'controller' => 'users',
                    'action' => 'login'
                ),
                'authenticate' => array(
                    'Form' => array(
                        'userModel' => 'CompaniesUser',
                        'passwordHasher' => 'Blowfish'
                )
            )
        )
    );

登录CTP:

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

保存项目之前的CompaniesUser Model:

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

数据库确实看起来确实有密码。

登录方法所在的UsersController.php ..

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

class UsersController extends AppController {

    public $uses = array(
        'Company','CompaniesUser'
    );



    public function login() 
    {
        //uses a different theme
        $this->layout = 'admin\login';

        if ($this->request->is('post')) {
            if (  $this->Auth->login() ) 
              return $this->redirect( $this->Auth->redirectUrl() );

            $this->Session->setFlash( __( Configure::read('UsersController.InvalidPassword') ), 'custom\flash' );
        }
    }

public function beforeFilter() 
    {
        parent::beforeFilter();
        $this->Auth->authenticate = array(
            'Basic' => array('userModel' => 'CompaniesUser'),
            'Form' => array('userModel' => 'CompaniesUser')
        );
        // Allow users to register and logout.
        $this->Auth->allow('register', 'logout', 'verify', 'verifyResend', 'verifyAuth');
    }

Cake仍然拒绝登录,并考虑$ this-&gt; Auth-&gt; login()是一个黑盒子,我无法看到SQL输出目前是什么样的。我已经尝试了一些使用DebugKit的指导,目前报道: Sql Logs

警告没有活动的数据库连接。 &lt; - 现在返回更改了表单名称的SQL。

任何有关事物的想法都可以尝试吗?

更新:从登录表单返回的SQL如下所示。

SELECT `CompaniesUser`.`id`, `CompaniesUser`.`company_id`, `CompaniesUser`.`name`,    `CompaniesUser`.`username`
  , `CompaniesUser`.`password`, `CompaniesUser`.`active`, `CompaniesUser`.`user_activation_hash`, `CompaniesUser`.`user_password_reset_hash`, `CompaniesUser`.`user_password_reset_timestamp`, `CompaniesUser`.`holidays_allocated`, `CompaniesUser`.`admin`, `CompaniesUser`.`manager`, `CompaniesUser`.`first_run_finished`, `CompaniesUser`.`payment_active`, `Company`.`id`, `Company`.`name`, `Company`.`account_type`, `Company`.`active`, `Company`.`stripe_customer_id`, `Company`.`payment_active` 
FROM `deckchair`.`companies_users` AS `CompaniesUser` 
LEFT JOIN `deckchair`.`companies` AS `Company` 
  ON (`CompaniesUser`.`company_id` = `Company`.`id`) 
WHERE `CompaniesUser`.`username` = 'user@test.com' LIMIT 1

2 个答案:

答案 0 :(得分:0)

我对蛋糕不太熟悉,但看到你的问题似乎在db中你是否尝试过打开终端并实时输出数据库general_log?

  

我无法看到当前的SQL输出。

例如,使用mysql,您可以执行类似......

的操作

检查您的常规日志是否已打开。

SHOW GLOBAL VARIABLES LIKE '%general_log%';

如果关闭,您的输出将类似于

   VARIABLE_NAME    <强>值   
   general_log   关闭   
   general_log_file    /var/lib/mysql/something.log


所以你会这样开启

SET GLOBAL general_log = 'ON'

然后,如果您使用Ubuntu,您将打开日志并使用

实时监控数据库的输出
sudo tail -f -n300 /var/lib/mysql/something.log # same path as general_log_file value from db query

通过这种方式,您可以确切地看到发生了什么。这让我以前得救了。警告,一定要在完成调试后关闭它。

但是,如果你正在

  

警告没有活动的数据库连接

上面提到的所有内容都可能是一个没有实际意义的点,您需要解决数据库连接问题。也许试试看看config / app.php。

但是,如果您将sql_dump.ctp布局元素保留在视图文件中,并且引用here,那么DebugKit似乎确实存在问题。

  

如果您在视图文件中保留了sql_dump.ctp布局元素,它将在DebugKit呈现工具栏之前使用日志。这不能解决登录问题,但它可以很好地帮助获得有关该问题的更多信息。

还有一件事。你在Windows环境下工作吗?你在UsersController.php文件中有不一致的斜杠方向我会选择所有向前斜线,但如果你在Windows服务器上我可能没有区别。

答案 1 :(得分:0)

在通过核心课程进行一些拖网搜寻以确定发生了什么后,我设法闯入了答案。 Base Authenticate第74行有$ settings,当var_dumped没有显示Blowfish设置的任何迹象时。

下面说明了这一点。不知道这是不是事先标准的Cake做事方式,或者确实为什么在Components数组中指定blowfish算法没什么区别,但也许这会帮助其他人。

public function beforeFilter() 
{
    parent::beforeFilter();
    $this->Auth->authenticate = array(
        'Form' => array('userModel' => 'CompaniesUser','passwordHasher' => 'Blowfish')
    );

    // Allow users to register and logout.
    $this->Auth->allow('register', 'logout', 'verify', 'verifyResend', 'verifyAuth', 'login');
}