
こんにちわ、Billyです。
今回はbaserCMSではないのですが、CakePHP2.4を使って開発している時に、
ちょっと困ったけど、解決したことがあったので記事にしました。
CakePHPでAuthComponentを利用すると、パスワードを暗号化してくれるのですが、
これが、仕様的にいらない、という事がありました。
(DBに平文でパスワード保存とかって、仕様的にどうなのか、というのはこの際置いておいて。)
CakePHP1系の頃にも対応したことがあったので楽勝、とか思ってたら、
CakePHP2で色々変わっていてちょっと時間がかかってしまいました。
CakePHP2.xの記事もいくつかあったのですが、CakePHP2.4では更に変わっていたという…。
前置きが長くなりましたが、
AuthComponent 利用時にパスワードを暗号化させない方法ですが、
CakePHP2.4ではパスワードのチェックにpasswordHasher というパスワードハッシュ化クラスを使うようです。
lib/Cake/Controller/Component/Auth/AbstractPasswordHasher.php を
app/Controller/Component/Auth/NonePasswordHasher.php などとしてコピーして
暗号化する処理を省けば良い、ということのようです。
app/Controller/Component/Auth/NonePasswordHasher.php
<?php
App::uses('AbstractPasswordHasher', 'Controller/Component/Auth');
class NonePasswordHasher extends AbstractPasswordHasher {
protected $_config = array('hashType' => null);
public function hash($password) {
return $password;
}
public function check($password, $hashedPassword) {
return $hashedPassword === $password;
}
}
app/Controller/Component/Auth/NonePasswordHasher.php
<?php
class AppController extends Controller {
:
public $components = array(
'Auth' => array(
:
'authenticate' => array(
'Form' => array(
'passwordHasher' => array(
'className' => 'None'
)
)
),
:
app/Model/User.php とかのbeforeSaveでパスワードを暗号化して保存する処理は、当然コメントするなりして外しておきましょう。
public function beforeSave($options = array()) {
// if (isset($this->data[$this->alias]['password'])) {
// $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
// }
return true;
}
ネット上には、まだまだCakePHP1系の記事と2系の記事がごちゃごちゃに出てくるし、
最新のCakePHP2.4の情報がまだまだ少ない感じでしたので、お役に立てれば、と思い記事にしました。
次期リリースの baserCMS3系 は CakePHP2を採用していますので、何かの役に立てれば!
参考:
パスワードのハッシュ化
http://book.cakephp.org/2.0/ja/core-libraries/components/authentication.html#hashing-passwords
カスタムパスワードハッシュ化クラスの作成
http://book.cakephp.org/2.0/ja/core-libraries/components/authentication.html#id14
シンプルな認証と承認のアプリケーション
http://book.cakephp.org/2.0/ja/tutorials-and-examples/blog-auth-example/auth.html