Admin dikecualikan dari aturan 1 akun 1 sesi
- LoginController: admin tidak ditolak saat login kedua (multi-sesi boleh) - Middleware SingleSession: admin tidak ditendang walau sesi ≠ token aktif - Alasan: admin terkunci = tidak ada yang bisa Paksa Logout akun lain - 2 test baru (login kedua admin diterima; middleware tidak menendang admin)
This commit is contained in:
@@ -25,8 +25,10 @@ class LoginController extends Controller
|
|||||||
if (Auth::attempt($credentials, $request->boolean('remember'))) {
|
if (Auth::attempt($credentials, $request->boolean('remember'))) {
|
||||||
$user = Auth::user();
|
$user = Auth::user();
|
||||||
|
|
||||||
// Single session: tolak login bila akun masih aktif di perangkat lain
|
// Single session: tolak login bila akun masih aktif di perangkat lain.
|
||||||
if ($user->sessionTokenIsAlive()) {
|
// Admin dikecualikan (bisa multi-sesi) — kalau admin ikut terkunci,
|
||||||
|
// tidak ada yang bisa menyelamatkan akun lain lewat Paksa Logout.
|
||||||
|
if (! $user->isAdmin() && $user->sessionTokenIsAlive()) {
|
||||||
Auth::logout();
|
Auth::logout();
|
||||||
|
|
||||||
return back()->withErrors([
|
return back()->withErrors([
|
||||||
|
|||||||
@@ -24,6 +24,12 @@ class SingleSession
|
|||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Admin dikecualikan dari aturan satu-sesi — boleh login di banyak
|
||||||
|
// perangkat sekaligus (pengaman: admin tidak boleh ikut terkunci).
|
||||||
|
if ($user->isAdmin()) {
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
|
||||||
$token = $user->active_session_token;
|
$token = $user->active_session_token;
|
||||||
|
|
||||||
if ($token && $token !== Session::getId()) {
|
if ($token && $token !== Session::getId()) {
|
||||||
|
|||||||
@@ -138,4 +138,39 @@ class SingleSessionTest extends TestCase
|
|||||||
$this->assertTrue($user->refresh()->sessionTokenIsAlive());
|
$this->assertTrue($user->refresh()->sessionTokenIsAlive());
|
||||||
@unlink($file);
|
@unlink($file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function test_admin_boleh_login_kedua_kali(): void
|
||||||
|
{
|
||||||
|
$admin = User::factory()->create([
|
||||||
|
'roles' => ['admin'],
|
||||||
|
'username' => 'adminsession',
|
||||||
|
'password' => 'rahasia123',
|
||||||
|
]);
|
||||||
|
$admin->forceFill(['active_session_token' => 'sesi-perangkat-lain'])->save();
|
||||||
|
|
||||||
|
// Admin dgn token aktif di perangkat lain → login tetap DITERIMA
|
||||||
|
$this->post('/login', [
|
||||||
|
'username' => 'adminsession',
|
||||||
|
'password' => 'rahasia123',
|
||||||
|
])->assertRedirect();
|
||||||
|
|
||||||
|
$this->assertAuthenticatedAs($admin);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_admin_tidak_ditendang_middleware(): void
|
||||||
|
{
|
||||||
|
$admin = User::factory()->create([
|
||||||
|
'roles' => ['admin'],
|
||||||
|
'username' => 'adminsession2',
|
||||||
|
'password' => 'rahasia123',
|
||||||
|
]);
|
||||||
|
$admin->forceFill(['active_session_token' => 'sesi-perangkat-lain'])->save();
|
||||||
|
|
||||||
|
// Sesi berbeda dari token aktif → admin tetap boleh masuk dashboard
|
||||||
|
$this->actingAs($admin)
|
||||||
|
->get('/dashboard')
|
||||||
|
->assertOk();
|
||||||
|
|
||||||
|
$this->assertAuthenticatedAs($admin);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user