この記事は,続きがあります。
下の通りやって動かない場合は,こちも参照してください。
私はCakePHP2.x系(今は,CakePHP2.10.x)で,サクッとWEBサイトを作りたい人です。今,CakePHPは4までリリースされており,PHPのフレームワーク自体も,「LARAVEL」が優勢だと聞きました。Ruby on Rails とかは最近どうなんでしょうね。どれぐらい使われているんだろう。
でも,それらを新しく勉強してサイトを構築する気はなく,CakePHP2系で十分だと思っています。もしくは,WordPress。あるいは,それらを並行して使う。CSSやJSの書き出しはwebpackを走らせれば良いので(SCSSも,TypeScriptも使える)。
さて,CakePHP2での大事な機能の1つに認証機能があります。
ユーザーのログインを管理するものですね。
大概は,ユーザー名とパスワードをフォームに打ち込んで,DBにあるデータと参照し,OKならログイン状態となります。
が,今リリースされているCakePHP2系では,どうもそこがうまく動きません。(私の環境だけ?!)
CakePHPの公式ドキュメント通りにやっても,認証がうまく機能しません。
「CakeBook 2 系:認証」
「CakeBook 2 系:シンプルな認証と承認のアプリケーション」
原因を辿っていくと,どうやら,Core.phpファイルにあるSecurity.Salt 値を,パスワードを平文から暗号化するときに,読み違えていることが分かりました。
おそらく,次のタイミングで,違う値を読んでいるのだと思います。
・平文のパスワードを,DBに書き込む際(beforeSave)
・平文のパスワードを,DBから読み出す際($this->Auth->login() )
なので,DBにパスワードを書き込む際に,beforeSave を使って自動的に暗号化されないようにします。すべて,コントローラー側で,パスワードを暗号化します。
具体的には次のような具体です。
(モデルでは,beforeSaveを使って暗号化しません。)
0)パスワードを暗号化するライブラリを読み込み
// コントローラーのいずれかの場所で
App::uses('SimplePasswordHasher', 'Controller/Component/Auth');
1)新しくユーザーを増やす場合
// POST されてきたデータを変数に代入
$data = $this->request->data;
// パスワードをハッシュ化
$password = $data['User']['password'];
$passwordHasher = new SimplePasswordHasher(['hashType' => 'sha256']);
$password = $passwordHasher->hash($password);
// POSTされてきたデータを上書き
$data['User']['password'] = $password;
// DBに保存
$this->User->create();
$this->User->save($data);
2)パスワードを再設定する場合
// ポストされたデータ($user)にて,
// パスワードを暗号化
$password = $user['User']['password'];
$passwordHasher = new SimplePasswordHasher(['hashType' => 'sha256']);
$password = $passwordHasher->hash($password);
// 上書き用のデータを作成
$data = [
'User' => [
'password' => $password,
],];
// 任意のIDの User データを指定
$this->User->id = $user['User']['id'];
// DBに保存
$this->User->save($data);
上の具合です。
ちなみに,この例では「sha256」を使っています。
Authコンポーネントを呼び出す際にも,パスワードはsha256を使うと明示してあげてください。
示す箇所は,おそらく,AppController.phpになると思います。
例えば,次のようになります。
public $components = [
'Auth' => [
'authenticate' => [
'Form' => [
'passwordHasher' => [
'className' => 'Simple',
'hashType' => 'sha256',
]]]]];
以上です。
投稿記事のカテゴリやタグと同じ記事をランダム表示します。