1
0
Fork 0
mirror of https://github.com/archtechx/tenancy.git synced 2026-03-22 05:34:04 +00:00
This commit is contained in:
lukinovec 2026-03-18 21:18:14 +01:00 committed by GitHub
commit 9dcabe5327
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 57 additions and 10 deletions

View file

@ -61,9 +61,9 @@ class UserImpersonation implements Feature
Auth::guard($token->auth_guard)->loginUsingId($token->user_id, $token->remember); Auth::guard($token->auth_guard)->loginUsingId($token->user_id, $token->remember);
$token->delete(); session()->put('tenancy_impersonation_guard', $token->auth_guard);
session()->put('tenancy_impersonating', true); $token->delete();
return redirect($token->redirect_url); return redirect($token->redirect_url);
} }
@ -76,16 +76,20 @@ class UserImpersonation implements Feature
public static function isImpersonating(): bool public static function isImpersonating(): bool
{ {
return session()->has('tenancy_impersonating'); return session()->has('tenancy_impersonation_guard');
} }
/** /**
* Logout from the current domain and forget impersonation session. * Logout from the current domain and forget impersonation session.
*/ */
public static function stopImpersonating(): void public static function stopImpersonating(bool $logout = true): void
{ {
auth()->logout(); if ($logout) {
$guard = session()->get('tenancy_impersonation_guard');
session()->forget('tenancy_impersonating'); auth($guard)->logout();
}
session()->forget('tenancy_impersonation_guard');
} }
} }

View file

@ -89,13 +89,14 @@ test('tenant user can be impersonated on a tenant domain', function () {
->assertSee('You are logged in as Joe'); ->assertSee('You are logged in as Joe');
expect(UserImpersonation::isImpersonating())->toBeTrue(); expect(UserImpersonation::isImpersonating())->toBeTrue();
expect(session('tenancy_impersonating'))->toBeTrue(); expect(session('tenancy_impersonation_guard'))->toBe('web');
expect($token->auth_guard)->toBe('web');
// Leave impersonation // Leave impersonation
UserImpersonation::stopImpersonating(); UserImpersonation::stopImpersonating();
expect(UserImpersonation::isImpersonating())->toBeFalse(); expect(UserImpersonation::isImpersonating())->toBeFalse();
expect(session('tenancy_impersonating'))->toBeNull(); expect(session('tenancy_impersonation_guard'))->toBeNull();
// Assert can't access the tenant dashboard // Assert can't access the tenant dashboard
pest()->get('http://foo.localhost/dashboard') pest()->get('http://foo.localhost/dashboard')
@ -135,19 +136,61 @@ test('tenant user can be impersonated on a tenant path', function () {
->assertSee('You are logged in as Joe'); ->assertSee('You are logged in as Joe');
expect(UserImpersonation::isImpersonating())->toBeTrue(); expect(UserImpersonation::isImpersonating())->toBeTrue();
expect(session('tenancy_impersonating'))->toBeTrue(); expect(session('tenancy_impersonation_guard'))->toBe('web');
expect($token->auth_guard)->toBe('web');
// Leave impersonation // Leave impersonation
UserImpersonation::stopImpersonating(); UserImpersonation::stopImpersonating();
expect(UserImpersonation::isImpersonating())->toBeFalse(); expect(UserImpersonation::isImpersonating())->toBeFalse();
expect(session('tenancy_impersonating'))->toBeNull(); expect(session('tenancy_impersonation_guard'))->toBeNull();
// Assert can't access the tenant dashboard // Assert can't access the tenant dashboard
pest()->get('/acme/dashboard') pest()->get('/acme/dashboard')
->assertRedirect('/login'); ->assertRedirect('/login');
}); });
test('stopImpersonating can keep the user authenticated', function() {
makeLoginRoute();
Route::middleware(InitializeTenancyByPath::class)->prefix('/{tenant}')->group(getRoutes(false));
$tenant = Tenant::create([
'id' => 'acme',
'tenancy_db_name' => 'db' . Str::random(16),
]);
migrateTenants();
$user = $tenant->run(function () {
return ImpersonationUser::create([
'name' => 'Joe',
'email' => 'joe@local',
'password' => bcrypt('secret'),
]);
});
// Impersonate the user
$token = tenancy()->impersonate($tenant, $user->id, '/acme/dashboard');
pest()->get('/acme/impersonate/' . $token->token)
->assertRedirect('/acme/dashboard');
expect(UserImpersonation::isImpersonating())->toBeTrue();
// Stop impersonating without logging out
UserImpersonation::stopImpersonating(false);
// The impersonation session key should be cleared
expect(UserImpersonation::isImpersonating())->toBeFalse();
expect(session('tenancy_impersonation_guard'))->toBeNull();
// The user should still be authenticated
pest()->get('/acme/dashboard')
->assertSuccessful()
->assertSee('You are logged in as Joe');
});
test('tokens have a limited ttl', function () { test('tokens have a limited ttl', function () {
Route::middleware(InitializeTenancyByDomain::class)->group(getRoutes()); Route::middleware(InitializeTenancyByDomain::class)->group(getRoutes());