web-dev-qa-db-ja.com

Laravel 5で現在、新しい、および新しいパスワードの確認を検証する方法?

UserController@getProfilePasswordおよびUserController@postProfilePasswordにパスワードルート、ビュー、およびメソッドを作成しました

現時点でnew_passwordフィールドに入力すると、ハッシュされてデータベースに正しく送信され、新しいパスワードでログインできます。

しかし、new_passwordnew_password_confirmを検証して、それらが同じであることを確認し、ユーザーの現在のパスワードも検証できるようにする必要があります。

どうやってやるの?

編集:$this->validateをメソッドに追加しましたが、単純なパスワードを使用しているので一致していてもエラーThe password confirmation confirmation does not match.を取得し続けます。また、validatorは私のためにそれをしないので、私は現在のパスワードに対して手動でチェックする必要があると思います。

public function getProfilePassword(Request $request) {
    return view('profile/password', ['user' => Auth::user()]);
}

public function postProfilePassword(Request $request) {
    $user = Auth::user();

    $this->validate($request, [
        'old_password'          => 'required',
        'password'              => 'required|min:4',
        'password_confirmation' => 'required|confirmed'
    ]);

    $user->password = Hash::make(Input::get('new_password'));
    $user->save();
}

これがビューです

<form action="{{ route('profile/updatepassword') }}" method="post" enctype="multipart/form-data">
    <div class="form-group">
          <label for="name">Current Password</label>
          <input type="password" name="old_password" class="form-control" id="old_password">
    </div>
    <div class="form-group">
          <label for="name">Password</label>
          <input type="password" name="password" class="form-control" id="password">
    </div>
    <div class="form-group">
          <label for="name">New Password</label>
          <input type="password" name="password_confirmation" class="form-control" id="password_confirmation">
    </div>
    <button type="submit" class="btn btn-primary">Change Password</button>
    <input type="hidden" value="{{ Session::token() }}" name="_token">
 </form>
13
Halnex

ユーザーが入力した古いパスワードが正しいかどうかを確認できるHash::check()関数があります。

usage

if (Hash::check("param1", "param2")) {
 //add logic here
}

param1 - user password that has been entered on the form
param2 - old password hash stored in database

古いパスワードが正しく入力されていればtrueを返し、それに応じてロジックを追加できます

ために new_passwordおよびnew_confirm_password同じように、次のようなフォームリクエストに検証を追加できます。

'new_password' => 'required',
'new_confirm_password' => 'required|same:new_password'
44
Sid

アプリケーション全体で一度だけカスタムルールの機能が必要な場合は、ルールオブジェクトの代わりにクロージャーを使用できます。 Closureは、属性の名前、属性の値、および検証が失敗した場合に呼び出される$ failコールバックを受け取ります

$request->validate([
    'new_password' => 'required|confirmed|min:4',
    'current_password' => ['required', function ($attribute, $value, $fail) use ($user) {
        if (!\Hash::check($value, $user->password)) {
            return $fail(__('The current password is incorrect.'));
        }
    }],
]);

https://laravel.com/docs/5.6/validation#using-closures

9
Steve

これを行うには、カスタム検証ルールを作成します(この例では、入力名として_current_password_と_new_password_を使用しています)。

これをAppServiceProvider::boot()に入れてください:

_Validator::extend('current_password', function ($attribute, $value, $parameters, $validator) {
    $user = User::find($parameters[0]);

    return $user && Hash::check($value, $user->password);
});
_

これで、コントローラーで以下を使用できます。

_$user = auth()->user(); // or pass an actual user here

$this->validate($request, [
    'current_password' => 'required_with:new_password|current_password,'.$user->id,
]);
_
4
kjdion84

すべてをチェックする完全な機能。送信する必要があるのはold_passwordnew_passwordおよびconfirm_password

public function changePassword(Request $request) {
            try {
                $valid = validator($request->only('old_password', 'new_password', 'confirm_password'), [
                    'old_password' => 'required|string|min:6',
                    'new_password' => 'required|string|min:6|different:old_password',
                    'confirm_password' => 'required_with:new_password|same:new_password|string|min:6',
                        ], [
                    'confirm_password.required_with' => 'Confirm password is required.'
                ]);

                if ($valid->fails()) {
                    return response()->json([
                                'errors' => $valid->errors(),
                                'message' => 'Faild to update password.',
                                'status' => false
                                    ], 200);
                }
    //            Hash::check("param1", "param2")
    //            param1 - user password that has been entered on the form
    //            param2 - old password hash stored in database
                if (Hash::check($request->get('old_password'), Auth::user()->password)) {
                    $user = User::find(Auth::user()->id);
                    $user->password = (new BcryptHasher)->make($request->get('new_password'));
                    if ($user->save()) {
                        return response()->json([
                                    'data' => [],
                                    'message' => 'Your password has been updated',
                                    'status' => true
                                        ], 200);
                    }
                } else {
                    return response()->json([
                                'errors' => [],
                                'message' => 'Wrong password entered.',
                                'status' => false
                                    ], 200);
                }
            } catch (Exception $e) {
                return response()->json([
                            'errors' => $e->getMessage(),
                            'message' => 'Please try again',
                            'status' => false
                                ], 200);
            }
        }
0
PHP Worm...

laravel 5.8/6.を使用して、ここで私は何をしますか(多くの追加コードなし)

ステップ1:検証

    $data = request()->validate([
        'firstname' => ['required', 'string', 'max:255'],
        'lastname' => ['required', 'string', 'max:255'],
        'username' => ['bail', 'nullable', 'string', 'max:255', 'unique:users'],
        'email' => ['bail', 'nullable', 'string', 'email:rfc,strict,dns,spoof,filter', 'max:255', 'unique:users'],
        'new_password' => ['nullable', 'string', 'min:8'],
        'confirm_new_password' => ['nullable', 'required_with:new_password', 'same:new_password'],
        'current_password' => ['required', function ($attribute, $value, $fail) {
            if (!\Hash::check($value, Auth::user()->password)) {
                return $fail(__('The current password is incorrect.'));
            }
        }]
    ]);

ステップ2:検証に合格した場合

  1. 配列を作成し、各入力値を確認します(検証に必要なタグが付いているものではありません)存在またはnull OR必要なことを行います。

例えば:

if(request(input)){
    $data += ['input' => request(input)];
}
  1. 作成した配列を使用してデータベースを更新する

例えば:

Auth::user()->account->update($data);
0
MR_AMDEV

古いパスワードを確認するために、confirmedを追加できます。 'required|confirmed''required|same:password'に変更して、passwordpassword confirmationを比較します

'old_password' => 'required|confirmed', 'password' => 'required|min:4', 'password_confirmation' => 'required|same:password'

がんばろう!

0
Sanji