feat: add account inactivity check during login and update related messages

This commit is contained in:
Yoga Pangestu 2026-04-30 14:45:52 +07:00
parent 69aff5a8a7
commit ad6b9e9618
5 changed files with 26 additions and 2 deletions

View File

@ -11,6 +11,7 @@
use Illuminate\Support\Facades\RateLimiter; use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
use Inertia\Inertia; use Inertia\Inertia;
use Laravel\Fortify\Features; use Laravel\Fortify\Features;
use Laravel\Fortify\Fortify; use Laravel\Fortify\Fortify;
@ -46,6 +47,12 @@ private function configureActions(): void
->first(); ->first();
if ($user && Hash::check($request->password, $user->password)) { if ($user && Hash::check($request->password, $user->password)) {
if (! $user->is_active) {
throw ValidationException::withMessages([
Fortify::username() => __('auth.inactive'),
]);
}
return $user; return $user;
} }
}); });

View File

@ -27,7 +27,7 @@ public function definition(): array
'username' => fake()->userName(), 'username' => fake()->userName(),
'email' => fake()->unique()->safeEmail(), 'email' => fake()->unique()->safeEmail(),
'password' => static::$password ??= Hash::make('password'), 'password' => static::$password ??= Hash::make('password'),
'is_active' => fake()->boolean(80), 'is_active' => true,
]; ];
} }

View File

@ -14,6 +14,7 @@
*/ */
'failed' => 'These credentials do not match our records.', 'failed' => 'These credentials do not match our records.',
'inactive' => 'Your account is inactive. Please contact the administrator.',
'password' => 'The provided password is incorrect.', 'password' => 'The provided password is incorrect.',
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',

View File

@ -4,6 +4,7 @@
return [ return [
'failed' => 'Identitas tersebut tidak cocok dengan data kami.', 'failed' => 'Identitas tersebut tidak cocok dengan data kami.',
'inactive' => 'Akun Anda sudah tidak aktif. Silakan hubungi administrator.',
'password' => 'Kata sandi salah.', 'password' => 'Kata sandi salah.',
'throttle' => 'Terlalu banyak upaya masuk. Silahkan coba lagi dalam :seconds detik.', 'throttle' => 'Terlalu banyak upaya masuk. Silakan coba lagi dalam :seconds detik.',
]; ];

View File

@ -61,6 +61,21 @@
assertGuest(); assertGuest();
}); });
it('cannot login if account is inactive', function () {
$user = User::factory()->create([
'email' => 'inactive@example.com',
'password' => bcrypt('password123'),
'is_active' => false,
]);
post(route('login'), [
'login' => 'inactive@example.com',
'password' => 'password123',
])->assertSessionHasErrors(['login' => __('auth.inactive')]);
assertGuest();
});
it('cannot login with non-existent email', function () { it('cannot login with non-existent email', function () {
post(route('login'), [ post(route('login'), [
'login' => 'notfound@example.com', 'login' => 'notfound@example.com',