6
respostas

[Dúvida] Como adaptar o comportamento padrão do Laravel e usar minhas colunas personalizadas?

Estou enfrentando um pequeno problema. Estou tentando criar a autenticação do usuário e está acontecendo o seguinte erro: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Pele que entendi o erro Undefined array key "password" ocorre porque o Laravel, por padrão, utiliza as colunas email e password para autenticar usuários. No meu caso, as colunas são personalizadas (email_Usuario e senha_Usuario).

Para corrigir o problema, creio que preciso adaptar o comportamento padrão do Laravel para usar as suas colunas personalizadas. Como resolver?

6 respostas

Oi,

Para resolver o problema de autenticação com colunas personalizadas no Laravel, você precisa fazer algumas adaptações no sistema de autenticação. Vou explicar o passo a passo:

Adaptando o Sistema de Autenticação

Configuração do Model User

Primeiro, adicione o método getAuthPassword() no seu modelo User:

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

Configuração do LoginController

No seu LoginController, sobrescreva o método username() para indicar qual coluna será usada para o login:

public function username()
{
    return 'email_Usuario';
}

Ajuste na Tentativa de Autenticação

Ao fazer a tentativa de autenticação, use os nomes das suas colunas personalizadas:

if (Auth::attempt([
    'email_Usuario' => $request->email_Usuario,
    'senha_Usuario' => $request->senha_Usuario
])) {
    $request->session()->regenerate();
    return redirect()->intended('dashboard');
}

Considerações Importantes

Tabela de Usuários

  • Certifique-se que a coluna de senha tenha pelo menos 60 caracteres de comprimento
  • Mantenha uma coluna remember_token nullable para funcionalidade "lembrar-me"

Validação

Para a validação dos campos, ajuste conforme suas colunas personalizadas:

$credentials = $request->validate([
    'email_Usuario' => ['required', 'email'],
    'senha_Usuario' => ['required'],
]);

Criptografia

Lembre-se que o Laravel espera que a senha esteja criptografada usando o Hash::make(). Ao criar um usuário:

'senha_Usuario' => Hash::make($request->senha_Usuario)

Seguindo estas adaptações, o sistema de autenticação do Laravel funcionará corretamente com suas colunas personalizadas

tux matrix
    Caso este post o tenha ajudado, por favor, marcar como solucionado ☑️. Bons Estudos! 🤓

Nada funciona:

<?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";  // Nome da tabela

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'email_Usuario',  // Coluna de email personalizada
        'senha_Usuario',  // Coluna de senha personalizada
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'senha_Usuario'  // Esconde a senha ao serializar o modelo
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    /**
     * Retorna a coluna personalizada de senha
     */
    public function getAuthPassword()
    {
        return $this->senha_Usuario;  // Retorna a senha personalizada
    }
}

**LoginController.php **

 public function store(Request $request)
    {
        $email = $request->email;
        $senha = md5($request->senha);

        //Busca o usuário com as cfredenciais fornecidas
        $usuario = User::where('email_Usuario', $email)
            ->where('senha_Usuario', $senha)
            ->first();
        
        if(!$usuario){
            return redirect()->back()->withErrors(['Usuário ou senha inválidos.']);
        }

        // Tentar autenticar com os campos personalizados
        if (!Auth::attempt([
            'email_Usuario' => $email,  // Coluna personalizada de email
            'senha_Usuario' => $senha   // Coluna personalizada de senha
        ])) {
            // Caso falhe, retorna erro
            $request->session()->regenerate();
            return redirect()->back()->withErrors(['Usuário ou senha inválidos.']);
        }

    }

Existem alguns problemas que precisam ser corrigidos:

Principais Problemas

Uso do MD5 O Laravel não espera que a senha esteja criptografada com MD5. Remova a função md5() e use o Hash::make() para criar senhas e Hash::check() para verificá-las.

Autenticação Duplicada Você está fazendo duas verificações: uma manual e outra com Auth::attempt(). Isso não é necessário.

Solução Proposta

Model User.php (está correto, mantenha como está)

LoginController.php corrigido:

use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;

public function store(Request $request)
{
    $credentials = [
        'email_Usuario' => $request->email,
        'senha_Usuario' => $request->senha
    ];

    if (Auth::attempt($credentials)) {
        $request->session()->regenerate();
        return redirect()->intended('dashboard');
    }

    return redirect()->back()->withErrors([
        'email' => 'Usuário ou senha inválidos.',
    ]);
}

Configuração Adicional

No seu arquivo config/auth.php, verifique se as configurações estão corretas:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],
],

Observações Importantes

  1. Nunca use MD5 para senhas - é inseguro e incompatível com o sistema de autenticação do Laravel
  2. Ao criar novos usuários, use:
'senha_Usuario' => Hash::make($request->senha)
  1. O Auth::attempt() já faz toda a verificação necessária, incluindo a comparação segura de senhas
  2. Certifique-se que as senhas no banco de dados estão criptografadas com o Hash::make()

Se ainda estiver tendo problemas, verifique se as senhas existentes no banco de dados foram criadas corretamente com Hash::make().

A questão é que as credenciais de acesso (login e senha) já estavam cadastradas no banco de dados, pois é um sistema antigo.

Para integrar um sistema Laravel com credenciais de acesso já existentes no banco de dados, você precisa criar um provedor de autenticação personalizado. Vou explicar como fazer isso:

Criando o Provedor Personalizado

Crie uma nova classe CustomUserProvider:

namespace App\Providers;

use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Contracts\Auth\Authenticatable;

class CustomUserProvider extends EloquentUserProvider
{
    public function validateCredentials(Authenticatable $user, array $credentials)
    {
        $senha = md5($credentials['senha_Usuario']);
        return $senha === $user->senha_Usuario;
    }
}

Registre o Provedor

No seu AuthServiceProvider.php:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Auth;

class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Auth::provider('custom', function ($app, array $config) {
            return new CustomUserProvider($app['hash'], $config['model']);
        });
    }
}

Configuração

No arquivo config/auth.php:

'providers' => [
    'users' => [
        'driver' => 'custom',
        'model' => App\Models\User::class,
    ],
],

No LoginController:

public function store(Request $request)
{
    $credentials = [
        'email_Usuario' => $request->email,
        'senha_Usuario' => $request->senha
    ];

    if (Auth::attempt($credentials)) {
        $request->session()->regenerate();
        return redirect()->intended('dashboard');
    }

    return redirect()->back()->withErrors([
        'email' => 'Credenciais inválidas'
    ]);
}

Esta solução permite que você mantenha o formato atual das senhas no banco de dados enquanto usa o sistema de autenticação do Laravel.

Nada ainda. Eu consegui modifciar as senhas de todos os usuários para a criptografia bcrypt usada pelo Laravel, mas mesmo assim o erro persiste. Retorna sempre false, por mais que o email cadastrado e a senha (já encriptada) estejam corretas.