Após logar e retornar para última página acessada
[Concluído]
Boa noite professor!
Estou com esse problema abaixo sem conseguir resolver no Laravel 9.19 com sistema de login: ui bootstrap --auth
Logado no dashboard, e depois de um tempo sem interação a página expira, e me leva para o login, até aí blz.
Após logar novamente redireciona para home do dashboard.
Como implementar para voltar para a última área acessada antes de expirar?
Por exemplo, se estiver numa página de listagem, ao logar voltar para essa mesma página.
Desde já grato pela ajuda!
Olá, Jackson!
Tudo bem?
Normalmente esse é o procedimento padrão do Laravel, ele faz um redirect()->back() para a última URL acessada antes do período de inativade.
Sua aplicação tem algo a mais? Tipo Livewre?
Porque algo assim pode estar mudando esse comportamento padrão.
Não utilizei o Livewire.
A única alteração que fiz, foi criar um middleware para identificar o perfil do usuário.
Experimenta fazer a auntenticação manual, e nela fazer um return back();
https://laravel.com/docs/10.x/authentication#authenticating-users
Pegou a ideia?
Então, estou autendicando manual como sugeriu no link da documentação.
Mas dentro da condicional Auth::attempt($credentials), tenho outro if para verificar a função do usuário, e direciono para a respectiva página.
No mesmo controller login, chamo um evento/listeners para registrar o acesso do usuário ao painel, e na sequencia o método para LogoutOtherDevices.
Será que esse evento e o método está interverindo no padrão?
Grato professor!! Abs
Compartilha comigo por favor esse trecho de código do auth manual.
Lá você faz um return back(); certo?
Dá uma olhada
public function login(Request $request)
{
$credentials = $request->validate([
'email' => ['required', 'email'],
'password' => ['required'],
]);
if (Auth::attempt($credentials)) {
// DISCONNECT THIS USER ON ANOTHER EQUIPMENT
Auth::logoutOtherDevices($request->password);
$request->session()->regenerate();
// REGISTER USER ACCESS
PanelAccessed::dispatch(auth()->user());
if (auth()->user()->role == 'director') {
return redirect()->route('dashboard.director');
} else if (auth()->user()->role == 'manager') {
return redirect()->route('dashboard.manager');
} else {
return redirect()->route('dashboard.secretary');
}
return redirect()->intended();
} else {
return redirect()->route('login')->with('error','Login inválido!');
}
return back()->withErrors([
'email' => 'As credenciais fornecidas não correspondem.',
])->onlyInput('email');
}
A lógica que fez, nunca vai chegar em:
return redirect()->intended();
Porque sempre vai cair no else, precisa usar outro elseif:
elseif (auth()->user()->role == 'secretary') {
return redirect()->route('dashboard.secretary');
}
Tem razão, mas mesmo colocando o elseif para testar o último usuário, e colocando dentro do else return redirect()->intended(); ou return back(); quando a página expira ainda não retorna para a página que estava antes de expirar :(
Isso deveria resolver:
redirect()->intended()
Certeza que está caindo nesse código? Como fez para debugar? Deletou a sessão manualmente no browser?
Sim, debuguei com dd logo no início do método login, e chega tá chegando lá.
O problema está na lógica que fiz para redirecionar para o painel do usuário logado, que são 3 distintos (director, manager, secretary).
Retirando essa parte vai sempre para RouteServiceProvider::HOME (secretary). Dessa forma expirando volta para a última página quando faço login.
Mas não estou conseguindo quando faço a condicional para saber o nível do usuário.
Entendi.
Teoricamente, o usuário estava acessando uma página que ele tem permissão (de acordo com a role dele), porque então não remover estes ifs, e deixar apenas o redirect intended?
Dessa forma sempre vai voltar para a última página acessada, caso contrário, sempre vai entrar em algum if e vai mudar a ação padrão.
Porque é multiusuario com painel distinto, se eu retirar os ifs para identificar a função do usuário, ao logar sempre levará para RouteServiceProvider::HOME que aponta para o dashboard da secretaria.
Os ifs tem esse objetivo de identificar a função do usuário e redirecionar para o dashboard de cada um deles.
Qual a forma correta de identificar a função, redirecionando para o dashboard correto, e manter a ação padrão, para quando a página expirar por inatividade, retornar para a mesma ao logar novamente?
Entendi amigo.
--
Tenho outra ideia para você.
Remova os ifs do login, e cria um middleware com estes filtros, e apenas na rota definida em RouteServiceProvider::HOME, você aplica esse middleware.
Ficando assim o comportamento ->
> Sessão expirou? Retorna para a última página acessada
> Eventualmente foi para RouteServiceProvider::HOME? Redireciona para o painel correto do usuário.
Essa lógica vai funcionar. Pegou a ideia?
Certo, vou transferir a lógica que fiz no controller para a middleware.
Na verdade eu já tenho uma middleware, que funciona assim.
public function handle(Request $request, Closure $next, $userRole)
{
if (auth()->user()-activated === 0){
Session::flush();
Auth::logout();
return redirect()->route('login')->with('error','Sem permissão de acesso!');
}
if (auth()->user()->type == $userRole) {
return $next($request);
}
return abort('403');
}
Mas vou seguir sua orientação, acredito q deva funcionar.
Muito grato por toda atenção!
Mestre Carlos, tudo bem amigo!
Funcionou bem com a middleware.
Grato por toda ajuda!
Abraço
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!