はじめに
パスワードをDBに保存する前にコントローラーでいちいちHash化の処理を書くのも面倒かと思います。
毎回はHash化の処理を書かなくて済む様に、requestのフィールド名に'password'が入っていた場合、自動でHash化され、その値でDBに保存される様にする方法を紹介します。
ただ、正直ベストな方法ではないかと思うので、他にもっと良い方法があればぜひ教えて頂きたいです!!
目次
カスタムキャストファイルを作成
app/Casts/HashMake.phpをコマンドではなく、普通にエディタで作成します。
ファイル名は任意に設定してください。
作成後は以下の様に記述してください。(コピペしてクラス名を変更してください)
<?php
namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use Illuminate\Support\Facades\Hash;
// HashMakeの部分は任意に命名、作成したファイル名と同じ文字にする
class HashMake implements CastsAttributes
{
public function get($model, $key, $value, $attributes)
{
// ここはDBからデータを取得する際の処理を記載
}
public function set($model, $key, $value, $attributes)
{
// ここはDBにデータを保存・更新する前の処理を記載
}
}
モデルにカスタムキャストを適用する
今回はパスワードをHash化する為、'password'のフィールドにカスタムキャストを指定します。
// User.php
// モデルでHashMakeをuse宣言する。
use App\Casts\HashMake;
class User extends Model
{
// 追記
protected $casts = [
// カスタムキャストの対象となるフィールドにHashMakeカスタムキャストを記述する
'password' => HashMake::class,
];
カスタムキャストにハッシュ化の処理を記述
この例では、setメソッドでパスワードのHash化を行い、getメソッドでは特に何も処理をせずにDBの値をそのまま返しています。
?php
namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use Illuminate\Support\Facades\Hash;
class HashMake implements CastsAttributes
{
// コントローラーからパスワードを取得する際に実行する処理
public function get($model, string $key, $value, array $attributes)
{
// 特に処理をせずに値を返す
return $value;
}
// コントローラーにパスワードを登録、更新する前の処理
public function set($model, string $key, $value, array $attributes)
{
// passwordのフィールドがnullではない &
if ($value !== null && Hash::needsRehash($value)){
$value = Hash::make($value);
}
// Hash化した後に値を返す
return $value;
}
}
__【各変数で取得できるデータ】__ $model ・・・ アクセスするモデル本体のデータが入っています。
// dd($model); 出力結果
// ※取得できるデータは省略して表示しています。
App\Models\User {#1563 ▼
#fillable: array:4 [▶]
#hidden: array:2 [▶]
#casts: array:4 [▶]
〜 省略 〜
#attributes: array:5 [▼
"id" => 1
"email" => "example@gmail.com"
"password" => "$2y$10$fS751izgOoe6qPwQOsYssOBsp8a6QSTrRKK2HpPpFjO1YqASyBSdO"
"created_at" => "2021-11-23 12:27:01"
"updated_at" => "2021-11-23 12:27:01"
]
#original: array:5 [▶]
〜 以降も省略 〜
$key ・・・ User.phpのモデルで設定したフィールド名(キー)を取得できます。
// dd($key); 出力結果
"password"
$value ・・・ User.phpのモデルで設定したフィールドの値(passwordの入力フォームで入力した値)を取得で来ます。※このパスワードがHash化されます。
// dd($value); 出力結果
"test1234"
$attributes ・・・ フィールドの値を配列で取得しています。
// dd($attributes); 出力結果
array:5 [▼
"id" => 1
"email" => "example@gmail.com"
"password" => "$2y$10$fS751izgOoe6qPwQOsYssOBsp8a6QSTrRKK2HpPpFjO1YqASyBSdO"
"created_at" => "2021-11-23 12:27:01"
"updated_at" => "2021-11-23 12:27:01"
]
最後に
あとはHash化されたパスワードをDBに登録及び更新すれば、処理完了となります。
暗号化ではなく、Hash化の為、DBからパスワードを取得する際は復元ができません。