1
1

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.

Laravel カスタムキャストを用いてパスワードのHash化を効率よく行う

Posted at

はじめに

パスワードをDBに保存する前にコントローラーでいちいちHash化の処理を書くのも面倒かと思います。
毎回はHash化の処理を書かなくて済む様に、requestのフィールド名に'password'が入っていた場合、自動でHash化され、その値でDBに保存される様にする方法を紹介します。

ただ、正直ベストな方法ではないかと思うので、他にもっと良い方法があればぜひ教えて頂きたいです!!

目次

  1. カスタムキャストファイルを作成
  2. モデルにカスタムキャストを適用する
  3. カスタムキャストにハッシュ化の処理を記述
  4. 最後に

カスタムキャストファイルを作成

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からパスワードを取得する際は復元ができません。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?