Laravel의 비밀번호 확인 작동 방식.

라라벨 소개.



암호 확인 미들웨어는 Laravel v6.2.0에서 도입되었으며 Illuminate/Auth에 내장되어 있으며 Illuminate/Auth/Middleware/RequirePassword.php에서 찾을 수 있습니다.

작동 방식.



들어오는 요청에서 password_confirmed_at 세션을 확인하고 결과에 따라 ResponseFactory를 사용하여 응답을 작성하여 JSON으로 응답하거나 password.confirm 경로로 리디렉션하고 성공하면 사용자를 다음으로 리디렉션합니다. 원래 경로 또는 세트$redirectTo 변수가 실패합니다.

토큰은 성공 시 기본적으로 3시간으로 설정되지만 auth.password_timeout 구성 옵션을 사용하여 사용자 정의할 수 있습니다.

비밀번호 확인 사용.



몇 가지 가정을 해봅시다. 먼저 사용자가 있고 해당 사용자가 일부 보안 설정을 변경할 수 있다고 가정해 보겠습니다. 예를 들어 암호를 변경하거나 양방향 인증을 비활성화할 수 있습니다.

특히 사용자가 나를 기억하는 기능을 사용하도록 허용하는 경우(예: Jane이 기억되도록 설정한 경우) 그녀는 브라우저를 닫고 자리를 비우고 나중에 John이 옵니다.

John은 또한 귀하의 사이트에 계정이 있으므로 Jane으로 로그인하기 위해서만 귀하의 사이트에 들어갑니다. 이제 John은 농담으로 일부 보안 설정을 변경하려고 하지만 엔드포인트/settings/security/에 도달하면 로그인하도록 승격됩니다. 제인이 모르는 제인의 비밀번호, 이제 제인의 보안 설정이 존조크에서 저장되었습니다.

나는 이것이 그것을 보는 순진한 방법이라는 것을 알고 있지만 요점은 여전히 ​​유효합니다. 때로는 사용자가 자신의 계정에 액세스하는 사람이라는 확인을 제공하기를 원할 것입니다.

그렇다면 이 순진한 예제를 만들어 보지 않겠습니까? 일부 인증을 사용하여 새로운 로컬 Laravel 애플리케이션을 실행해 봅시다.

laravel new password-confirmation --auth


참고: 따라하고 싶다면 저는 Laravel 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!');
    }
}


우리의 견해를 추가합니다.



남은 작업은 보기를 만드는 것이므로 secret 아래에 폴더 이름resources/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로 이동하는 경우 비밀 편집을 계속하기 전에 비밀번호를 확인하라는 메시지가 표시됩니다.






결론적으로.



Laravel에서 암호 확인을 추가하는 것은 간단합니다. 몇 가지 제한 사항이 있지만 암호 확인은 사후 요청에서 사용할 수 없으므로 기본적으로 secret.store 자체에 추가할 수 없습니다.

보지는 않았지만 해당 기능을 제공하는 패키지가 거의 확실하며 패키지를 찾으면 나중에 여기에 추가하겠습니다.

이제 프로덕션 준비가 된 데모를 말하는 건가요? 아니요, 항상 필드나 모델을 업데이트할 때 단순한 유효성 검사 요구 사항 이상을 확인해야 하지만 프로젝트에서 이 기능을 사용할 수 있는 위치에 대한 아이디어를 얻을 수 있기를 바랍니다.

항상 읽어주셔서 감사합니다. 제 GitHub( thinkverse/password-confirmation )에서 이 데모의 전체 소스를 찾을 수 있습니다.

좋은 웹페이지 즐겨찾기