はじめに
cakePHPのブログチュートリアルに沿って簡易的なブログを作った過程で、苦慮した箇所を纏めました。
パスワードのハッシュ化
セキュリティ対策の為、登録されたパスワードのハッシュ化を行いました。
//パスワードのハッシュ化
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;
}
beforeSaveでパスワードが保存される前に、BlowfishPasswordHasherを使用してパスワードをハッシュ化を行う。
class AppController extends Controller {
public $components = array(
'Auth' => array(
'loginRedirect' => array(
'controller' => 'posts',
'action' => 'index'
),
'logoutRedirect' => array(
'controller' => 'posts',
'action' => 'index'
),
'authenticate' => array(
'Form' => array(
//パスワードのハッシュ化処理
'passwordHasher' => 'Blowfish',
)
)
)
)
}
'passwordHasher'は、CakePHPがどのハッシュアルゴリズムを使用するかを指定するための設定で、'Blowfish'は、bcryptハッシュアルゴリズムを使用するための設定。他のハッシュアルゴリズムを設定することも可能らしい。。。
論理削除
自分が投稿したデータを削除する場合は、物理削除ではなく論理削除を行うようにしました。
今回、論理削除の実装にはCakeDC/utilsのSoftDeleteBehaviorを使用しました。
データベースに下記の論理削除用のカラムを作成
削除フラグ
カラム名:deleted
型:tinyint(1)
※デフォルト値:0
削除日
名前:deleted_date
型:datetime
※デフォルト値:NULL
CakePlugin::load('Utils');
まずはプラグインを読み込みます。
<?php
class Post extends AppModel {
public $actsAs = array('Utils.SoftDelete');
}
?>
SoftDeleteBehaviorを利用できるようにします。
class AppModel extends Model {
public function exists($id = null) {
if ($this->Behaviors->loaded('SoftDelete')) {
return $this->existsAndNotDeleted($id);
} else {
return parent::exists($id);
}
}
public function delete($id = null, $cascade = true) {
$result = parent::delete($id,$cascade);
if ($result === false && $this->Behaviors->enabled('SoftDelete')) {
return (bool)$this->field('deleted', array('deleted' => 1));
}
return $result;
}
}
$this->Behaviors->loaded('SoftDelete')
で SoftDelete ビヘイビアが適用されているか確認してます。もし適用されている場合、 $this->existsAndNotDeleted($id)
メソッドを使用して削除されていないデータが存在するかどうかを判断し、そうでない場合は、元のexists メソッドを呼び出します。
existsAndNotDeleted メソッドは、$idで指定されたデータが存在し、削除フラグが立っていない場合に true を返します。
参考
【PHP】CakePHPでパスワードをハッシュ化する
初めての[CakePHP2.x]での開発、そして挫折するまで日記~その5 論理削除