app/Http/Controllers/Auth/PasswordChangeController.php (76 lines of code) (raw):
<?php
namespace App\Http\Controllers\Auth;
use App\Models\User\User;
use Illuminate\Support\Str;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use App\Http\Requests\PasswordChangeRequest;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Foundation\Auth\RedirectsUsers;
use Illuminate\Contracts\Auth\CanResetPassword;
class PasswordChangeController extends Controller
{
use RedirectsUsers;
protected $redirectTo = '/settings/security';
/**
* Get useful parameters from request.
*
* @param \App\Http\Requests\PasswordChangeRequest $request
* @return array
*/
protected function credentials(PasswordChangeRequest $request)
{
return $request->only(
'password_current', 'password', 'password_confirmation'
);
}
/**
* Change user password.
*
* @param \App\Http\Requests\PasswordChangeRequest $request
*/
public function passwordChange(PasswordChangeRequest $request)
{
$credentials = $this->credentials($request);
$response = $this->validateAndPasswordChange($credentials);
return $response == 'passwords.changed'
? $this->sendChangedResponse($response)
: $this->sendChangedFailedResponse($response);
}
/**
* Validate a password change request and update password of the user.
*
* @param array $credentials
*
* @return string|Authenticatable
*/
protected function validateAndPasswordChange($credentials)
{
$user = $this->validateChange($credentials);
if (! $user instanceof CanResetPassword) {
return $user;
}
if ($user instanceof User) {
$this->setNewPassword($user, $credentials['password']);
}
return 'passwords.changed';
}
/**
* Validate a password change request with the given credentials.
*
* @param array $credentials
*
* @return string|Authenticatable
*
* @throws \UnexpectedValueException
*/
protected function validateChange(array $credentials)
{
if (is_null($user = $this->getUser($credentials))) {
return 'passwords.invalid';
}
return $user;
}
/**
* Get the user with the given credentials.
*
* @param array $credentials
*
* @return null|Authenticatable
*/
protected function getUser(array $credentials): ?Authenticatable
{
/** @var User */
$user = Auth::user();
// Using current email from user, and current password sent with the request to authenticate the user
if (! Auth::attempt([
'email' => $user->getEmailForPasswordReset(),
'password' => $credentials['password_current'],
])) {
// authentication fails
return null;
}
return $user;
}
/**
* Set the new password if all validation has passed.
*
* @param User $user
* @param string $password
* @return void
*/
protected function setNewPassword($user, $password)
{
$user->password = Hash::make($password);
$user->setRememberToken(Str::random(60));
$user->save();
Auth::guard()->login($user);
}
/**
* Get the response for a successful password change.
*
* @param string $response
* @return \Illuminate\Http\RedirectResponse
*/
protected function sendChangedResponse($response)
{
return redirect($this->redirectPath())
->with('status', trans($response));
}
/**
* Get the response for a failed password change.
*
* @param string $response
* @return \Illuminate\Http\RedirectResponse
*/
protected function sendChangedFailedResponse($response)
{
return redirect($this->redirectPath())
->withErrors(['password' => trans($response)]);
}
}