2
respostas

[Bug] Problema de Autenticação com Colunas Personalizadas no Laravel (senha_Usuario e email_Usuario)

Estou com um problema de autenticação em uma aplicação Laravel e espero que alguém possa me ajudar a identificar o erro.

Contexto: Estou criando um sistema de login onde, no banco de dados, as colunas de email e senha são email_Usuario e senha_Usuario, respectivamente (em vez de email e password como padrão no Laravel). O modelo de User foi modificado para refletir essas colunas personalizadas.

Modelo User (com colunas personalizadas):

<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    protected $table = 'usuarios';


    protected $fillable = [
        /*'name',*/
        /*'email',
        'password',*/
        'email_Usuario',
        'senha_Usuario',
    ];

  
    protected $hidden = [
        'senha_Usuario',
        'remember_token',
    ];

  
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];


    //Retorna a senha do usuário
    public function getAuthPassword()
    {
        return $this->senha_Usuario;
    }
}

**Controller LoginController: **

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;

class LoginController extends Controller
{

    //Retorna a view página de login
    public function index()
    {
        return view('paginas.login');
    }


    //Cria o login de fato
    public function store(Request $request)
    {
        // Validação dos dados
        $request->validate([
            'email_Usuario' => 'required|email',
            'senha_Usuario' => 'required',
        ]);

        // Credenciais
        $credenciais = $request->only('email_Usuario', 'senha_Usuario');

        dd(Auth::attempt($credenciais));
        //Programa Interropido pelo 'dd' e sempre retorna falso, mesmo existindo um registro com email_Usuario e senha_Usuario existentes

        if(Auth::attempt($credenciais)){
            return redirect()->route('home');
        }

        // Senha incorreta ou usuário não encontrado
        return redirect()->back()->withErrors(['login' => 'Credenciais inválidas.']);
    }


    //Destoi o login do usuário
    public function destroy()
    {
        Auth::logout();
        return to_route('login');
    }
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Problema:

Quando tento usar Auth::attempt() com senha_Usuario e email_Usuario, a autenticação retorna false.

Tentei comparar a senha diretamente com md5() e fiz a comparação de forma manual, mas o problema persiste.

Já configurei o método getAuthPassword() para retornar a senha correta, mas não estou conseguindo fazer a comparação com a senha armazenada corretamente.

O que eu tentei:

Modificar o modelo User para usar a coluna senha_Usuario.

Usar md5() para comparar a senha fornecida com a senha armazenada no banco de dados (embora o Laravel use bcrypt() por padrão). Usar Auth::attempt($credenciais) sem sucesso.

Gostaria de saber se alguém já passou por um problema similar ou tem alguma ideia de como resolver a autenticação utilizando colunas personalizadas para email e senha.

Agradeço desde já pela ajuda!

2 respostas

Olá! Tudo bem?

Pelo que você descreveu, parece que o problema está relacionado ao uso de colunas personalizadas para email e senha.

  1. Modificação do método de autenticação:

    O Laravel, por padrão, espera que as credenciais sejam email e password. Como você está usando email_Usuario e senha_Usuario, é necessário ajustar a forma como as credenciais são passadas para o método Auth::attempt().

  2. Ajuste no LoginController:

    Você precisa usar o campo password ao invés de senha_Usuario no método Auth::attempt(). Isso porque o Laravel espera que a senha seja passada como password para poder aplicar o hash corretamente.

    public function store(Request $request)
    {
        // Validação dos dados
        $request->validate([
            'email_Usuario' => 'required|email',
            'senha_Usuario' => 'required',
        ]);
    
        // Credenciais
        $credenciais = [
            'email_Usuario' => $request->email_Usuario,
            'password' => $request->senha_Usuario,
        ];
    
        if (Auth::attempt($credenciais)) {
            return redirect()->route('home');
        }
    
        // Senha incorreta ou usuário não encontrado
        return redirect()->back()->withErrors(['login' => 'Credenciais inválidas.']);
    }
    
  3. Verificação de Hash:

    Certifique-se de que as senhas estão sendo armazenadas com o hash bcrypt. Se você usou md5 ou outro método, o Auth::attempt() não funcionará corretamente, pois ele usa bcrypt para verificar a senha.

    Caso precise ajustar as senhas no banco de dados, use:

    use Illuminate\Support\Facades\Hash;
    
    // Para criar um hash bcrypt de uma senha
    $hashedPassword = Hash::make('sua_senha');
    
  4. Verifique o método getAuthPassword:

    Certifique-se de que o método getAuthPassword() está correto, como você já fez, para que ele retorne senha_Usuario.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Se o campo de senha não é password, uma forma de você autenticar o usuário é buscá-lo no banco (User::where('email_Usuario', $request->email_Usuario);), verificar a senha dele (Hash::check($request->senha_Usuario, $user->senha_Usuario)) e se tudo estiver ok, fazer Auth::login($user).

Essa é a forma mais simples sem precisar de nenhum conhecimento adicional. ;-)