@snapey, I had actually tried this middleware first and it doesn't work for me. Once redirected, any link I click on from there redirects me back to login. Is it possible it has something to do with the one Livewire component that polls the server every X seconds?
Here is the middleware implemented:
// Impersonate Middleware
namespace App\Http\Middleware;
use Auth;
use Closure;
use Illuminate\Http\Request;
class Impersonate
{
public function handle(Request $request, Closure $next)
{
if( Auth::check()
// Tested w/ & w/o the following line verifying user role
&& Auth::user()->hasAnyRole(['SuperAdmin','Admin'])
&& session()->has('impersonate')
) {
Auth::onceUsingID( session('impersonate') );
}
return $next($request);
}
}
// Kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Laravel\Jetstream\Http\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\SetUserRoutePrefix::class,
\App\Http\Middleware\UserOnline::class,
\App\Http\Middleware\Impersonate::class,
],
...
];
public function switchUser($id)
{
$impersonated = User::find($id);
session()->put(['impersonate' => $impersonated->id]);
session()->save();
return redirect()->route('dashboard');
}
// navigation-menu.blade.php
@if( session('user_is_switched') || session('impersonate') )
<div class="alert bg-red-600 text-white text-center py-3 leading-none flex flex-col md:flex-row justify-center">
<div class="self-center">You are currently logged in as {{ ucwords(Auth::user()->name) ?? '... well that\'s weird - you\'re logged in as no one.' }}.</div>
<a href="{{ route('user.restore') }}" class="mt-3 md:mt-0 md:ml-2 bg-white bg-opacity-25 font-bold text-sm tracking-tight px-2 py-1 rounded self-center">Restore Login</a>
</div>
@endif
Route::group(['prefix' => '{prefix}', 'middleware' => ['auth']], function () {
// ...
// Restore user to original user from impersonated user
Route::get('/restore-user', 'RestoreSwitchedUser@restoreUser')->name('user.restore');
// ...
});
public function restoreUser()
{
session()->forget('impersonate');
session()->save();
return redirect()->back();
}