Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Auth::login() não está persistindo na sessão

Oi pessoal, tudo bom?

Meu stack está um pouco diferente do curso, mas não foge ao assunto.

Stack de desenvolvimento:

  • Laravel
  • DoctrineORM
  • Autenticação LDAP

Pois bem, por se tratar de uma autenticação LDAP, meu processo de auth é um pouco diferente. Eu não uso o Auth::attempt, por exemplo.

No meu controller de Login eu faço o seguinte:

public function auth(LoginRequest $request)
    {
        $auth = Adldap::auth()->attempt($request->user.env('LDAP_USER_SUFIX'), $request->password, true);
        if($auth){
            $userData = Ldap::ldapUserAttributes($request->user);
            $user = new User($userData['name'], $userData['mail']);
            Auth::login($user);
            return redirect()->route('dashboard');
        }
        return redirect()->back()->withErrors('Usuário e/ou senha incorretos');
    }

O User aqui é uma classe que implementa o Authenticatable, mas não é nenhuma representação de entidade de banco de dados. Uso apenas para criar um objeto e guardá-lo na sessão.

Minhas rotas são como se seguem:


Route::get ('/login',                               [Login::class, 'index'])                                        ->name('login');
Route::post('/login',                               [Login::class, 'auth'])                                         ->name('auth');

Route::middleware([ 'auth'])->group(function () {
    Route::get('/dashboard', [Dashboard::class, 'index'])->name('dashboard');
});

Assim, se eu salvar em Log ou imprimir na tela o que está em Auth::user() logo após o Auth::login($user); me é apresentado os dados do usuário que realizou o login. Entretanto, ao fazer o teste na aplicação, após eu realizar o login, a página de login me era apresentada novamente. Então percebi que o usuário não estava ficando salvo na sessão (no Auth).

Para testar isso, removi o middleware de auth da rota /dashboard e verifiquei verifiquei o que estava chegando no Auth::user() lá. O que me é apresentado é NULL.

Ou seja, no momento do login, o Auth::user() existe, mas após o redirect, fica sendo NULL, aparentemente é algo com a sessão.

Fiz um teste para verificar se dados de sessão estão sendo guardados. No login, antes do redirect, salvei na sessão um dado e tentei recuperá-lo na rota /dashboard, o que ocorreu perfeitamente.

Não sei o que está acontecendo com o Auth::login($user) para que a sessão não seja guardada. O que posso fazer?

Abaixo está o código da classe User

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\Authenticatable;

class User implements Authenticatable
{
    private $cpf;
    private $username;
    private $email;
    private $senha;
    private $remember_token;

    public function __construct(string $cpf, string $username, string $email)
    {
        $this->cpf = $cpf;
        $this->username = $username;
        $this->email = $email;
    }

    public function getUsername()
    {
        return $this->username;
    }

    public function getEmail()
    {
        return $this->email;
    }

    public function getCpf()
    {
        return $this->cpf;
    }

    public function getAuthIdentifierName()
    {
        return $this->username;
    }

    public function getAuthIdentifier()
    {
        return $this->cpf;
    }

    public function getAuthPassword()
    {
        return $this->senha;
    }

    public function getRememberToken()
    {
        return $this->remember_token;
    }

    public function setRememberToken($value)
    {
        $this->remember_token = $value;
    }

    public function getRememberTokenName()
    {
        return $this->remember_token;
    }
}

Observação: Senha e Remember_token eu não uso na aplicação, apenas inseri para implementar o Autenticatable

1 resposta
solução!

Eu queria fazer uma autenticação sem qualquer tipo de consulta em banco de dados.

A forma que estava fazendo não iria funcionar, pois em algum momento ainda ocorria alguma tentativa de ir no banco de dados obter o usuário com aquele identificador específico.

Então, eu parti para implementar meu próprio Guard, o que resolveu meu problema.

Para isso, segui esse exemplo: https://stackoverflow.com/questions/50602198/laravel-how-to-authenticate-users-without-db, mas adequei para minha necessidade.

Deixo aqui a resposta para que outros não passem pelo que eu passei.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software