AuthコンポーネントのパスワードをCakePHPを使用せずハッシュ化する方法(パスワードの生成ルール)

CakePHP2のAuthコンポーネントで使用されるパスワードは、
SimplePasswordHasherでhashTypeをsha256にした場合、
Security.saltをパスワードの前に付けて、sha256でハッシュ化されたもの
がデータベースに保存されています。

[参考記事] CakePHP3のパスワードの生成ルール

PHPのコードで、データベースに保存されているパスワードを生成するには

echo hash('sha256', '【Security.saltの値】' . '【パスワード】');

MySQLのSQL文では

sha2(CONCAT('【Security.saltの値】' , '【パスワード】'),256)

です。

ユーザーを追加するSQL文は次のようになります。

INSERT INTO `users` (`username`, `password`, `created`, `modified`)
VALUES
('【アカウント】',sha2(CONCAT('【Security.saltの値】' , '【パスワード】'),256), NOW(), NOW());

Security.saltの値

/cakephp/app/Config/core.php の236行目付近

Configure::write('Security.salt', 'xxxxxxxxxxxxxxxxxxxx');

コントローラの記述例

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

class AppController extends Controller {
    public $components = array(
        'Auth'=> array(
        //非ログイン時のリダイレクト先
            'loginAction'=>array(
                'controller'=>'Auth',
                'action'=>'login'
            ),
        //ログイン後のリダイレクト先
            'loginRedirect'=>array(
                'controller'=>'Top',
                'action'=>'index'
            ),
        //ログアウト後のリダイレクト先
            'logoutRedirect'=>array(
                'controller'=>'Auth',
                'action'=>'login'
            ),
        //認証情報(モデルやハッシュ化ルール)
            'authenticate' => array(
                'Form' => array(
                    'userModel' => 'User',
                    'fields' => array(
                        'username' => 'account',
                    ),
                    'passwordHasher' => array(
                        'className' => 'Simple',
                        'hashType' => 'sha256'
                    )
                )
            )
        )
    );
}

モデルの記述例

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

class User extends AppModel
{
    public $useTable = "users";

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

関連記事

スポンサーリンク

複数のデータベースを切り替える方法(別データベースを使用する)

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る