components([ TextInput::make('login') ->label('Nama Pengguna atau Alamat Surel') ->placeholder('johndoe@gmail.com') ->required() ->autocomplete(false) ->autofocus(), TextInput::make('password') ->label('Kata Sandi') ->placeholder('********') ->password() ->revealable(filament()->arePasswordsRevealable()) ->required() ->autocomplete(false) ->extraInputAttributes(['tabindex' => 2]) ->hint( filament()->hasPasswordReset() ? new HtmlString(Blade::render('{{ __(\'filament-panels::auth/pages/login.actions.request_password_reset.label\') }}')) : null ), ]); } protected function getCredentialsFromFormData(#[SensitiveParameter] array $data): array { $loginType = filter_var($data['login'], FILTER_VALIDATE_EMAIL) ? 'email' : 'username'; return [ $loginType => $data['login'], 'password' => $data['password'], ]; } public function authenticate(): ?LoginResponse { try { $this->rateLimit(5); } catch (TooManyRequestsException $exception) { $this->getRateLimitedNotification($exception)?->send(); return null; } $data = $this->form->getState(); /** @var SessionGuard $authGuard */ $authGuard = Filament::auth(); $authProvider = $authGuard->getProvider(); /** @phpstan-ignore-line */ $credentials = $this->getCredentialsFromFormData($data); $user = $authProvider->retrieveByCredentials($credentials); if ((! $user) || (! $authProvider->validateCredentials($user, $credentials))) { $this->userUndertakingMultiFactorAuthentication = null; $this->fireFailedEvent($authGuard, $user, $credentials); $this->throwFailureValidationException(); } if ( filled($this->userUndertakingMultiFactorAuthentication) && (decrypt($this->userUndertakingMultiFactorAuthentication) === $user->getAuthIdentifier()) ) { $this->multiFactorChallengeForm->validate(); } else { foreach (Filament::getMultiFactorAuthenticationProviders() as $multiFactorAuthenticationProvider) { if (! $multiFactorAuthenticationProvider->isEnabled($user)) { continue; } $this->userUndertakingMultiFactorAuthentication = encrypt($user->getAuthIdentifier()); if ($multiFactorAuthenticationProvider instanceof HasBeforeChallengeHook) { $multiFactorAuthenticationProvider->beforeChallenge($user); } break; } if (filled($this->userUndertakingMultiFactorAuthentication)) { $this->multiFactorChallengeForm->fill(); return null; } } if (! $authGuard->attemptWhen($credentials, function (Authenticatable $user): bool { if (! ($user instanceof FilamentUser)) { return true; } return $user->canAccessPanel(Filament::getCurrentOrDefaultPanel()); }, $data['remember'] ?? false)) { $this->fireFailedEvent($authGuard, $user, $credentials); $this->throwFailureValidationException(); } session()->regenerate(); CheerfulNotification::success( 'Hore! Berhasil Masuk 🎉', 'Selamat datang kembali, '.$user->name.'! Siap untuk beraksi hari ini? 🚀✨' )->send(); return app(LoginResponse::class); } protected function throwFailureValidationException(): never { CheerfulNotification::danger( 'Ups! Gagal Masuk 😅', 'Sepertinya ada yang salah nih. Coba cek email atau kata sandi mu lagi ya! 🤔🔐' )->send(); throw ValidationException::withMessages([]); } }