[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Jackson Lemos Moreira
Criador Jackson Lemos Moreira 11/06/2023

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!

Manager Carlos Ferreira 11/06/2023

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.

Carlos Ferreira
Criador Jackson Lemos Moreira 11/06/2023

Não utilizei o Livewire. 

A única alteração que fiz, foi criar um middleware para identificar o perfil do usuário.

Jackson Lemos Moreira
Manager Carlos Ferreira 11/06/2023

Experimenta fazer a auntenticação manual, e nela fazer um return back();
https://laravel.com/docs/10.x/authentication#authenticating-users

Pegou a ideia?

Carlos Ferreira
Criador Jackson Lemos Moreira 11/06/2023

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

Jackson Lemos Moreira
Manager Carlos Ferreira 11/06/2023

Compartilha comigo por favor esse trecho de código do auth manual.

Lá você faz um return back(); certo?

Carlos Ferreira
Criador Jackson Lemos Moreira 11/06/2023

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');

    }

Jackson Lemos Moreira
Manager Carlos Ferreira 11/06/2023

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');
}

Carlos Ferreira
Criador Jackson Lemos Moreira 11/06/2023

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 :(

Jackson Lemos Moreira
Manager Carlos Ferreira 11/06/2023

Isso deveria resolver:
redirect()->intended()

Certeza que está caindo nesse código? Como fez para debugar? Deletou a sessão manualmente no browser?

Carlos Ferreira
Criador Jackson Lemos Moreira 11/06/2023

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.

 

Jackson Lemos Moreira
Manager Carlos Ferreira 11/06/2023

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.

Carlos Ferreira
Criador Jackson Lemos Moreira 11/06/2023

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? 

Jackson Lemos Moreira
Manager Carlos Ferreira 11/06/2023

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?

Carlos Ferreira
Criador Jackson Lemos Moreira 11/06/2023

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!

Jackson Lemos Moreira
Criador Jackson Lemos Moreira 11/06/2023

Mestre Carlos, tudo bem amigo!
Funcionou bem com a middleware.

Grato por toda ajuda!

Abraço

Jackson Lemos Moreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!