MIF_E31222882/app/Http/Controllers/Auth/ResetPasswordController.php

147 lines
4.8 KiB
PHP

<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\ResetsPasswords;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Str;
use Illuminate\Auth\Events\PasswordReset;
class ResetPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset requests
| and uses a simple trait to include this behavior. You're free to
| explore this trait and override any methods you wish to tweak.
|
*/
use ResetsPasswords {
reset as protected traitReset;
}
/**
* Where to redirect users after resetting their password.
*
* @var string
*/
protected $redirectTo = '/';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Display the password reset view for the given token.
*
* @param \Illuminate\Http\Request $request
* @param string|null $token
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function showResetForm(Request $request, $token = null)
{
// Pass token directly as a query parameter instead of route parameter
return redirect()->route('home', [
'token' => $token,
'email' => $request->email,
'reset' => 'true' // Add explicit reset parameter for more compatibility
])->with('reset', true);
}
/**
* Override the reset method from the trait to prevent auto-login
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
public function reset(Request $request)
{
$request->validate($this->rules(), $this->validationErrorMessages());
// Here's the main change - instead of using the trait reset method,
// we implement a custom reset logic without the auto-login
$response = $this->broker()->reset(
$this->credentials($request),
function ($user, $password) {
$this->resetPassword($user, $password);
// Don't login the user automatically
// Auth::guard()->login($user); <-- This line is removed
}
);
// If the password was successfully reset, we will redirect the user back to
// the application's home authenticated view with a success message.
return $response == Password::PASSWORD_RESET
? $this->sendResetResponse($request, $response)
: $this->sendResetFailedResponse($request, $response);
}
/**
* Reset the given user's password.
*
* @param \Illuminate\Contracts\Auth\CanResetPassword $user
* @param string $password
* @return void
*/
protected function resetPassword($user, $password)
{
$user->password = bcrypt($password);
$user->setRememberToken(Str::random(60));
$user->save();
event(new PasswordReset($user));
// Don't login automatically
// $this->guard()->login($user); <-- This line is removed
}
/**
* Get the response for a successful password reset.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetResponse(Request $request, $response)
{
// Redirect to home with success message and open login modal
return redirect()->route('home')
->with('success', 'Password berhasil direset.')
->with('login_error', 'Silakan login dengan password baru Anda.');
}
/**
* Get the response for a failed password reset.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetFailedResponse(Request $request, $response)
{
// Return to home with reset modal open showing the error
return redirect()->route('home', [
'token' => $request->token,
'email' => $request->email,
'reset' => 'true' // Add explicit reset parameter for more compatibility
])
->with('reset', true)
->with('error', trans($response))
->withErrors(['email' => trans($response)]);
}
}