どのようにLaravelのパスワード確認機能します.


ラーラベル入門


パスワード確認ミドルウェアはLaravel v6.2.0 , そして、それは照明/authに組み込まれて、下で見つかりますIlluminate/Auth/Middleware/RequirePassword.php

どのように動作します。


それを見ることによって動作しますpassword_confirmed_at 受信したリクエストのセッションを行い、結果に基づいてResponseFactory JSONに応答したり、password.confirm ルートでは、成功すると、元のルートまたはセットにユーザーをリダイレクトします$redirectTo 変数が失敗しました.
トークンは、成功時にデフォルトで3時間に設定されますが、auth.password_timeout 設定オプション.

パスワード確認の使用。


いくつかの前提を作りましょう.まず、ユーザがいて、それらのユーザが何らかのセキュリティ設定を変更できると仮定しましょう.例えば、パスワードを変更したり、2ウェイ認証を無効にすることができます.
それはあなたが保護したいかもしれない何かです、特にあなたがあなたのユーザーに覚えているMe機能を使用するならば、ジェーンが記憶されるように設定されていると言うならば、彼女はブラウザーを閉じて、離れて歩きます.
ジョンもあなたのサイトでアカウントを持っているので、彼はJaneとしてログインするだけであなたのサイトに入ります、現在ジョンは冗談として若干のセキュリティ設定を変えたいです、しかし、彼が終点に達するとき/settings/security/ 彼はジェーンのパスワードを入力するために昇進するでしょう、彼が知らない今、Janes Security Settingsはジョンジョークから救われました.
私は、これはそれを見てのナイーブな方法であることを知っているが、ポイントはまだ立って、時々あなたのユーザーが彼らが自分のアカウントにアクセスしているものであることを確認を与えるようになります.
では、なぜこの小さなナイーブな例を作成しないのですか?いくつかのauth新しいローカルlaravelアプリケーションをスピンしましょう.
laravel new password-confirmation --auth
注意: Lilavel ValetとPHP 7.3を使用しています.

私たちの秘密を移行します。


できるだけ簡単にしておくために、我々のコラムにコラムを加えましょうusers 表.
php artisan make:migration create_user_settings --table users
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('secret')->nullable();
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('secret');
    });
}
そしてもちろん、移行することを忘れないでくださいsecretfillable アレイオンUser .

新しいルートとコントローラ。


では、いくつかのルートを追加しましょう.この単純なグループ継承を使用し、新しいSecretController .
Route::group(['middleware' => ['auth']], function () {
    Route::post('/secret', 'SecretController@store')->name('secret.store');

    Route::group(['middleware' => ['password.confirm']], function () {
        Route::get('/secret/edit', 'SecretController@edit')->name('secret.edit');
    });
});
私たちのコントローラも、いくつかの基本的な検証を簡単になります.
class SecretController extends Controller
{
    public function edit()
    {
        return view('secret.edit');
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'secret' => 'required|string'
        ]);

        auth()->user()->update($request->all());

        return redirect()->route('home')->with('status', 'Secret added!');
    }
}

ビューの追加


すべてを残して私たちのビューを作成するので、フォルダ名を追加するsecretresources/views を作成し、edit.blade.php ファイル.
このファイルは私たちの秘密を更新するためのフォームを含みます.
<form action="{{ route('secret.store') }}"  method="POST">
    @csrf

    <div class="form-group is-invalid">
        <label for="secret">Your secret</label>
        <input id="secret" type="text" name="secret" class="form-control @error('secret') is-invalid @enderror" value="{{ old('secret') }}" aria-describedby="secret-help" required>
        <div class="d-flex justify-content-between w-100">
            <small id="secret-help" class="form-text text-muted @error('secret') is-invalid @enderror">We'll never share your secret with anyone else.</small>
            @error('secret')<div class="invalid-feedback w-auto">{{ $message }}</div>@enderror
        </div>
    </div>

    <button type="submit" class="btn btn-primary">Save</button>
</form>
また、我々の編集home.blade.php 私たちの秘密を表示するファイルは、ダッシュボードカードの下に次のように追加します.
<div class="card mb-5">
    <div class="card-body text-center">
        @if (auth()->user()->secret)
            {{ auth()->user()->secret }}
        @else
            You don't have any secret yet, <a href="{{ route('secret.edit') }}" title="Edit secret">add one.</a>
        @endif
    </div>
</div
今すぐ旅行する場合secret/edit あなたの秘密を編集するために続行する前に、パスワードを確認するよう求められます.


最後に。


いくつかの制限がありますが、パスワードの確認をポストリクエストで使用することはできませんので、それを追加することはできませんsecret.store 自身.
私は見ていないが、ほぼ確実にその機能を与えるパッケージがあります、そして、私が1つを見つけるならば、私はあなたの利益のために後でここでそれを加えます.
今私は私はそれが生産準備をしたデモを言っていますか?いいえ、常にフィールドやモデルを更新するときは、単純な妥当性検査の要件をチェックしてください.
いつものように、読んでいただきありがとうございます、私のgithubにこのデモのための完全なソースを見つけることができますthinkverse/password-confirmation ).