0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CakePHP 会員登録、ログイン機能の実装

Posted at

はじめに

cakePHPのブログチュートリアルに沿って簡易的なブログを作った過程で、苦慮した箇所を纏めました。

パスワードのハッシュ化

セキュリティ対策の為、登録されたパスワードのハッシュ化を行いました。

Model / User.php

//パスワードのハッシュ化
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を使用してパスワードをハッシュ化を行う。

Controller / AppController.php

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

Config / bootstrap.php
CakePlugin::load('Utils');

まずはプラグインを読み込みます。

Model / Post.php
<?php
class Post extends AppModel {
    public $actsAs = array('Utils.SoftDelete');
}
?>

SoftDeleteBehaviorを利用できるようにします。

Model / AppModel.php
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 論理削除

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?