feat: Update admin panel login configuration to use custom Login page
This commit is contained in:
parent
33f5d1b368
commit
1dc187be9e
152
app/Filament/Pages/Auth/Login.php
Normal file
152
app/Filament/Pages/Auth/Login.php
Normal file
@ -0,0 +1,152 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filament\Pages\Auth;
|
||||
|
||||
use App\Filament\Support\SystemNotification;
|
||||
use DanHarrin\LivewireRateLimiting\Exceptions\TooManyRequestsException;
|
||||
use DiogoGPinto\AuthUIEnhancer\Pages\Auth\Concerns\HasCustomLayout;
|
||||
use Filament\Auth\Http\Responses\Contracts\LoginResponse;
|
||||
use Filament\Auth\MultiFactor\Contracts\HasBeforeChallengeHook;
|
||||
use Filament\Auth\Pages\Login as FilamentLogin;
|
||||
use Filament\Facades\Filament;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Models\Contracts\FilamentUser;
|
||||
use Filament\Schemas\Schema;
|
||||
use Illuminate\Contracts\Auth\Authenticatable;
|
||||
use Illuminate\Contracts\Support\Htmlable;
|
||||
use Illuminate\Support\Facades\Blade;
|
||||
use Illuminate\Support\HtmlString;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use SensitiveParameter;
|
||||
|
||||
class Login extends FilamentLogin
|
||||
{
|
||||
use HasCustomLayout;
|
||||
|
||||
public function getHeading(): string|Htmlable
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
public function form(Schema $schema): Schema
|
||||
{
|
||||
return $schema
|
||||
->components([
|
||||
TextInput::make('login')
|
||||
->label('Nama Pengguna atau Alamat Surel')
|
||||
->placeholder('johndoe@example.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('<x-filament::link :href="filament()->getRequestPasswordResetUrl()" tabindex="3">{{ __(\'filament-panels::auth/pages/login.actions.request_password_reset.label\') }}</x-filament::link>'))
|
||||
: 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();
|
||||
|
||||
$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();
|
||||
|
||||
SystemNotification::success(
|
||||
'Berhasil Masuk ✨',
|
||||
'Selamat datang kembali, '.$user->name.'. Sesi Anda telah berhasil diaktifkan dengan aman.'
|
||||
)->send();
|
||||
|
||||
return app(LoginResponse::class);
|
||||
}
|
||||
|
||||
protected function throwFailureValidationException(): never
|
||||
{
|
||||
SystemNotification::danger(
|
||||
'Gagal Masuk 🚫',
|
||||
'Terjadi kendala saat proses masuk. Mohon periksa kembali alamat surel atau kata sandi Anda.'
|
||||
)->send();
|
||||
|
||||
throw ValidationException::withMessages([]);
|
||||
}
|
||||
}
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Providers\Filament;
|
||||
|
||||
use App\Filament\Pages\Auth\Login;
|
||||
use DiogoGPinto\AuthUIEnhancer\AuthUIEnhancerPlugin;
|
||||
use Filament\Http\Middleware\Authenticate;
|
||||
use Filament\Http\Middleware\AuthenticateSession;
|
||||
@ -29,7 +30,7 @@ public function panel(Panel $panel): Panel
|
||||
->id('admin')
|
||||
->path('admin')
|
||||
->viteTheme('resources/css/filament/admin/theme.css')
|
||||
->login()
|
||||
->login(Login::class)
|
||||
->colors([
|
||||
'primary' => Color::Amber,
|
||||
])
|
||||
|
||||
Loading…
Reference in New Issue
Block a user