2016-07-08 10 views
1

Недавно я начал новый проект на Laravel 5, и я пытаюсь реализовать функцию входа.Laravel 5 Auth :: попытка() всегда возвращает false

Для имени пользователя я использую код, который может быть CPF или CNPJ (бразильские регистрационные номера для физических лиц (CPF) и компании (CNPJ), отформатированные как 999.999.999-99 и 99.999.999/9999- 99 соответственно), который сохраняется в базе данных со всеми точками, тире и косой чертой, а вход замаскирован, поэтому они также отформатированы с входа (я дважды проверил ввод строки, переданный по переменной $ username, это правильно).

Проблема заключается в том, что метод Auth :: попытка() всегда возвращает значение false. Я пробовал все ответы, найденные в stackoverflow об этой проблеме, но никто из них не решил ее, поэтому я открываю еще один вопрос.

Я использую Laravel 5.0.16 в окружении Homestead и локальную базу данных MySQL, предоставленную Homestead.

Это моя форма:

<form id="login-form" class="contact-form" name="contact-form" method="post"  
 
    action="/auth/login">               
 
<div>                   
 
\t <div class="form-group">             
 
\t \t <div class="form-group">            
 
\t \t \t <label>CPF/CNPJ</label>            
 
\t \t \t <input type="text" name="username" class="form-control cpfcnpj"> 
 
\t \t </div>                 
 
\t \t <div class="form-group">            
 
\t \t \t <label>Senha</label>            
 
\t \t \t <input type="password" name="password" class="form-control">  
 
\t \t </div>                 
 
\t \t <input type="hidden" name="_token" value="{{ csrf_token() }}">   
 
\t \t <div class="form-group" style="margin-top: 30px">      
 
\t \t \t <button type="submit" name="submit" class="btn btn-primary btn-lg"> 
 
\t \t \t \t Entrar               
 
\t \t \t </button>               
 
\t \t </div>                 
 
\t </div>                  
 
</div>                   
 
</form>                  

Это мой User.php:

namespace App; 

use Illuminate\Auth\Authenticatable; 
use Illuminate\Database\Eloquent\Model; 
use Illuminate\Auth\Passwords\CanResetPassword; 
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; 
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; 

class User extends Model implements AuthenticatableContract, CanResetPasswordContract { 

use Authenticatable, CanResetPassword; 

/** 
* The database table used by the model. 
* 
* @var string 
*/ 
protected $table = 'PESSOA'; 

/** 
* The attributes that are mass assignable. 
* 
* @var array 
*/ 
protected $fillable = ['sqpessoa', 'cpfcnpj', 'password', 'nome', 'email', 'telefone', 'contato', 'tipo']; 

/** 
* The attributes excluded from the model's JSON form. 
* 
* @var array 
*/ 
protected $hidden = ['password', 'remember_token']; 

/** 
* 
* @var type 
*/ 
protected $primaryKey = 'sqpessoa'; 

/** 
* 
* @var type 
*/ 
public $timestamps = false; 

/** 
* Get the unique identifier for the user. 
* 
* @return mixed 
*/ 
public function getAuthIdentifier() { 
    return $this->attributes['sqpessoa']; 
} 

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

}

Мой AuthController:

namespace App\Http\Controllers\Auth; 

use App\Http\Controllers\Controller; 
use Illuminate\Contracts\Auth\Guard; 
use Illuminate\Contracts\Auth\Registrar; 
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; 

class AuthController extends Controller { 
    /* 
     |-------------------------------------------------------------------------- 
     | Registration & Login Controller 
     |-------------------------------------------------------------------------- 
     | 
     | This controller handles the registration of new users, as well as the 
     | authentication of existing users. By default, this controller uses 
     | a simple trait to add these behaviors. Why don't you explore it? 
     | 
    */ 

use AuthenticatesAndRegistersUsers; 

    /** 
    * Create a new authentication controller instance. 
    * 
    * @param \Illuminate\Contracts\Auth\Guard $auth 
    * @param \Illuminate\Contracts\Auth\Registrar $registrar 
    * @return void 
    */ 
    public function __construct(Guard $auth, Registrar $registrar) { 
     $this->auth = $auth; 
     $this->registrar = $registrar; 

     $this->middleware('guest', ['except' => 'getLogout']); 
    } 

    /** 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return type 
    */ 
    public function postLogin(\Illuminate\Http\Request $request) { 
     $this->validate($request, array('username' => 'required', 'password' => 'required')); 

     $username = $request->input('username'); 
     $password = $request->input('password'); 

     if (\Auth::attempt(['cpfcnpj' => $username, 'password' => $password])) { 
      return redirect()->intended($this->redirectPath()); 
     } 

     return redirect($this->loginPath())->withInput($request->only('username', 'remember'))->withErrors(array('username' => 'Credenciais inválidas.')); 
    } 
} 

Моя миграция для пользователей (названный как 'Пессоа') базы данных:

class CreatePessoaTable extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('PESSOA', function (Blueprint $table) { 
      $table->increments('SQPESSOA'); 
      $table->string('CPFCNPJ', 20)->unique(); 
      $table->string('PASSWORD', 255); 
      $table->string('NOME', 200); 
      $table->string('EMAIL', 200); 
      $table->string('TELEFONE', 15); 
      $table->string('CONTATO', 200)->nullable(); 
      $table->enum('TIPO', ['avulso', 'mensalista', 'patio']); 
      $table->rememberToken(); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::drop('PESSOA'); 
    } 

} 

И семя:

class PessoaTableSeeder extends Seeder 
{ 
    public function run() 
    { 
     DB::table('PESSOA')->truncate(); 

     $faker = Faker\Factory::create('pt_BR'); 

     DB::table('PESSOA')->insert([ 
      'cpfcnpj' => $faker->cnpj, 
      'password' => bcrypt('test'), 
      'nome' => 'Admin', 
      'email' => '[email protected]', 
      'telefone' => $faker->phoneNumber, 
      'contato' => str_random(), 
      'tipo' => 'patio' 
     ]); 

     for ($i = 0; $i < 10; $i++) { 
      DB::table('PESSOA')->insert([ 
       'cpfcnpj' => $faker->unique()->cpf, 
       'password' => bcrypt($faker->password), 
       'nome' => $faker->name, 
       'email' => $faker->email, 
       'telefone' => $faker->phoneNumber, 
       'contato' => str_random(), 
       'tipo' => 'avulso' 
      ]); 
     } 

     for ($i = 0; $i < 3; $i++) { 
      DB::table('PESSOA')->insert([ 
       'cpfcnpj' => $faker->unique()->cnpj, 
       'password' => bcrypt($faker->password), 
       'nome' => $faker->company, 
       'email' => $faker->companyEmail, 
       'telefone' => $faker->phoneNumber, 
       'contato' => str_random(), 
       'tipo' => 'mensalista' 
      ]); 
     } 
    } 
} 

Спасибо заранее.

ответ

2

Ваш Auth::attempt ищет cpfcnpj как имя пользователя, но вы указали sqpessoa как поле имени пользователя по методу getAuthIdentifier().

Также вы указали cpfcnpj в качестве поля пароля в getAuthPassword(), тогда как Auth::attempt имеет cpfcnpj как имя пользователя вместо пароля.

+0

Спасибо за быстрый ответ, это решить мою проблему частично, но я должен был изменить свои атрибуты базы данных делать строчными тоже, как Альфредо сказал на другой ответ, только после того, как я использовал оба решения он работал. По какой-то причине он не работает с верхними строками, я пытался изменить каждый отдельный атрибут на верхний регистр как в коде, так и в базе данных, и он не работал, я не могу найти причину этого. – Leno

+0

Скорее всего, «атрибут» жестко закодирован или преобразован в нижний регистр внутри 'vendor', и, как мы все знаем, каталог' vendor' безупречен, его никто не может коснуться. – user2094178

1

переименовывает в cpfcnpj столбцов и пароль к в БД и объявления массива

R2 строчными:

Следуя метод покушать, вы можете увидеть что во многих местах он ждет «пароля» в нижнем регистре, проблема только в этом поле. CPFCNPJ может быть в верхнем регистре.

http://i.stack.imgur.com/EYGnX.png

+0

Это сработало, но вы можете объяснить, почему он не работает с нижними регистрами? Кроме того, извините за то, что вы не подтвердили свой ответ как правильный, так как я не могу проверить два ответа как правильные, даже если оба мне помогли. – Leno

Смежные вопросы