You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.2 KiB
85 lines
2.2 KiB
<?php |
|
|
|
namespace App\Http\Requests\Auth; |
|
|
|
use Illuminate\Auth\Events\Lockout; |
|
use Illuminate\Foundation\Http\FormRequest; |
|
use Illuminate\Support\Facades\Auth; |
|
use Illuminate\Support\Facades\RateLimiter; |
|
use Illuminate\Support\Str; |
|
use Illuminate\Validation\ValidationException; |
|
|
|
class LoginRequest extends FormRequest |
|
{ |
|
/** |
|
* Determine if the user is authorized to make this request. |
|
*/ |
|
public function authorize(): bool |
|
{ |
|
return true; |
|
} |
|
|
|
/** |
|
* Get the validation rules that apply to the request. |
|
* |
|
* @return array<string, \Illuminate\Contracts\Validation\Rule|array|string> |
|
*/ |
|
public function rules(): array |
|
{ |
|
return [ |
|
'email' => ['required', 'string', 'email'], |
|
'password' => ['required', 'string'], |
|
]; |
|
} |
|
|
|
/** |
|
* Attempt to authenticate the request's credentials. |
|
* |
|
* @throws \Illuminate\Validation\ValidationException |
|
*/ |
|
public function authenticate(): void |
|
{ |
|
$this->ensureIsNotRateLimited(); |
|
|
|
if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) { |
|
RateLimiter::hit($this->throttleKey()); |
|
|
|
throw ValidationException::withMessages([ |
|
'email' => trans('auth.failed'), |
|
]); |
|
} |
|
|
|
RateLimiter::clear($this->throttleKey()); |
|
} |
|
|
|
/** |
|
* Ensure the login request is not rate limited. |
|
* |
|
* @throws \Illuminate\Validation\ValidationException |
|
*/ |
|
public function ensureIsNotRateLimited(): void |
|
{ |
|
if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { |
|
return; |
|
} |
|
|
|
event(new Lockout($this)); |
|
|
|
$seconds = RateLimiter::availableIn($this->throttleKey()); |
|
|
|
throw ValidationException::withMessages([ |
|
'email' => trans('auth.throttle', [ |
|
'seconds' => $seconds, |
|
'minutes' => ceil($seconds / 60), |
|
]), |
|
]); |
|
} |
|
|
|
/** |
|
* Get the rate limiting throttle key for the request. |
|
*/ |
|
public function throttleKey(): string |
|
{ |
|
return Str::transliterate(Str::lower($this->input('email')).'|'.$this->ip()); |
|
} |
|
}
|
|
|