UserController@getProfilePassword
およびUserController@postProfilePassword
にパスワードルート、ビュー、およびメソッドを作成しました
現時点でnew_password
フィールドに入力すると、ハッシュされてデータベースに正しく送信され、新しいパスワードでログインできます。
しかし、new_password
とnew_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>
ユーザーが入力した古いパスワードが正しいかどうかを確認できる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'
アプリケーション全体で一度だけカスタムルールの機能が必要な場合は、ルールオブジェクトの代わりにクロージャーを使用できます。 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.'));
}
}],
]);
これを行うには、カスタム検証ルールを作成します(この例では、入力名として_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,
]);
_
すべてをチェックする完全な機能。送信する必要があるのはold_password
、new_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);
}
}
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:検証に合格した場合
例えば:
if(request(input)){
$data += ['input' => request(input)];
}
例えば:
Auth::user()->account->update($data);
古いパスワードを確認するために、confirmed
を追加できます。 'required|confirmed'
を'required|same:password'
に変更して、password
とpassword confirmation
を比較します
'old_password' => 'required|confirmed', 'password' => 'required|min:4', 'password_confirmation' => 'required|same:password'
がんばろう!