2014-06-25 7 views
0

Я, я только начал с Laravel, но у меня все еще есть проблема с моей аутентификацией. Мне нужно создать свою систему на существующей структуре базы данных. Пароль пользовательской таблицы использует md5, и мне нравится преобразовывать это в Laravel Hash. Но после преобразования пароля md5 в hash логин завершился неудачей с этим новым хэшем. Я не могу найти решение этой проблемы.Ошибка аутентификации Laravel

Таблица

  • идентификатор (int11)
  • gebruikersnaam (VARCHAR 255)
  • спам-роботов (VARCHAR 255)
  • updated_at (метка времени)
  • created_at (метка времени)
  • remember_token (временная метка)

модель пользователя

use Illuminate\Auth\UserTrait; 
use Illuminate\Auth\UserInterface; 
use Illuminate\Auth\Reminders\RemindableTrait; 
use Illuminate\Auth\Reminders\RemindableInterface; 

class User extends Eloquent implements UserInterface, RemindableInterface { 

use UserTrait, RemindableTrait; 

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


/** 
* The attributes excluded from the model's JSON form. 
* 
* @var array 
*/ 
protected $hidden = array('wachtwoord'); 

} 

Войти контроллер

class LoginController extends BaseController { 

    function starten(){ 

     $rules = array(
      'gebruikersnaam' => 'required', // make sure the email is an actual email 
      'wachtwoord' => 'required' // password can only be alphanumeric and has to be greater than 3 characters 
     ); 


     $validator = Validator::make(Input::all(), $rules); 

     if ($validator->fails()) { 
      return Redirect::to('/') 
      ->withErrors($validator) 
      ->withInput(Input::except('password')); 
     } else { 

      $user = User::where('gebruikersnaam','=',Input::get('gebruikersnaam'))      
          ->first(); 

      if(isset($user)) { 

       if($user->wachtwoord == md5(Input::get('wachtwoord'))) { 
        $user->wachtwoord = Hash::make(Input::get('wachtwoord')); 
        $user->save(); 
       } 

      }   

      $userdata = array(
       'gebruikersnaam' => Input::get('gebruikersnaam'), 
       'wachtwoord' => Input::get('wachtwoord') 
      ); 

      if (Auth::attempt($userdata)) { 

       return Redirect::to('users/dashboard') 
           ->with('message', 'You are now logged in!'); 

      } else { 
       return Redirect::to('/') 
           ->with('message', 'Deze combinatie van gebruikersnaam en wachtwoord lijkt helaas niet te kloppen') 
           ->withInput(); 

      } 

     } 

    } 

} 

Auth

return array(


    'driver' => 'eloquent', 

    'model' => 'User', 

    'table' => 'gebruikers', 

    'reminder' => array(

     'email' => 'emails.auth.reminder', 

     'table' => 'password_reminders', 

     'expire' => 60, 

    ), 

    'username' => 'gebruikersnaam', 
    'password' => 'wachtwoord', 

); 

Примечание: Вход :: получить ('спам-роботов') и Вход :: get ('gebruikersnaam') заполняется корректно по почте в контроллере. Md5 правильно изменен на хэши Laravel в моем db, поэтому я не могу найти проблему, с которой я имею дело.

Примечание2: "gebruikersnaam" голландское имя пользователя и "спам-роботов" является голландца пароль

Примечание 3: Я использую Laravel 4

** EDIT **

Выход $ пользователя

["attributes": protected] => array (16) {["id"] => int (8681) ["gebruikersnaam"] => string (22) "---" ["wachtwoord"] => строка (60) "$ 2y $ 10 $ i3bemDK9NzNf/E0jmliv/eBPrqhq/3s3WGPTX3h6WNCMlXcS5W51i" ["email"] = > string (22) "---" ["voornaam"] => string (5) "Jelle" ["tussenvoegsel"] => NULL ["achternaam"] => string (4) "Pals" ["school_id" ] => int (110) ["telefoonnummer"] => string (10) "0655684308" ["geslacht"] => string (3) "man" ["geboortedatum"] => string (19) "1990-03 -22 09:00:00 "[" groep_id "] => int (8811) [" status "] => string (1)" 1 "[" updated_at "] => string (19)" 2014-06-25 14:53:43 "[" created_at "] => string (19)" 0000-00-00 00:00:00 "[" remember_token "] => string (0)" "}

** Найдено странно 000000 в updated_at **

enter image description here

+0

Я внимательно изучил этот код, но я не мог найти недостатков. Не могли бы вы создать нового пользователя и опубликовать хеш-пароль, который будет в базе данных после его хэширования? – thpl

+0

Спасибо, что комментировали. Ive hashed 'test' -> '$ 2y $ 10 $ bFqhL0J33g11iWQ9wa5Xv.AjhdaNp1nbTDsrvg9MRs6svTxVDZfo.' – JelleP

+0

Хорошо, хэш имеет длину 60 символов, как и должно быть. Это кажется довольно странным. После сохранения модели попробуйте сбросить ее, содержит ли объект свойство пароля? – thpl

ответ

3

Я думаю, что проблема в том, что вы используете настройки по умолчанию красноречивых пользователей (UserTrait), которые предполагают, что ваш пароль поле «пароль» (см. here), но вы используете «wachtwoord». Таким образом, логины не работают из-за отсутствия значения в столбце пароля (из-за отсутствия полного столбца) для проверки паролей.

В случае, если вы думаете, «но я четко указываю столбец пароля в моей конфигурации auth!» это, к сожалению, немного красная селедка - эта часть конфигурации предназначена для использования стандартного DB auth, тогда как вы используете Eloquent auth (обратите внимание, как в вашей конфигурации у вас есть driver, установленный на eloquent?), поэтому вам нужно чтобы указать эти поля в вашей модели согласно interface.

К счастью, собственная реализация класса переопределяет черту признака, поэтому теоретически можно сохранить черту на вашей модели и просто переопределить метод getAuthPassword.

Это говорит о том, что эта черта (и напоминающая) очень сильно предполагает, что вы используете английские имена повсюду, поэтому вам может стоить полностью удалить две черты (UserTrait и RemindableTrait) и написать собственные версии как вы, вероятно, увидите то же самое, если/когда вы используете «запомнить меня» или «забытый пароль».


Edit: первоначальное предложение:

use Illuminate\Auth\UserTrait; 
use Illuminate\Auth\UserInterface; 
use Illuminate\Auth\Reminders\RemindableTrait; 
use Illuminate\Auth\Reminders\RemindableInterface; 

class User extends Eloquent implements UserInterface, RemindableInterface 
{ 
    use UserTrait, RemindableTrait; 

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


    /** 
    * The attributes excluded from the model's JSON form. 
    * 
    * @var array 
    */ 
    protected $hidden = array('wachtwoord'); 

    /** 
    * Override UserTrait#getAuthPassword 
    */ 
    public function getAuthPassword() 
    { 
     return $this->wachtwoord; 
    } 
} 

Но, как я говорю, если вы будете продолжать использовать голландские имена столбцов, вы в конечном итоге лучше сбросив черты целиком и реализации методов самостоятельно:

use Illuminate\Auth\UserInterface; 
use Illuminate\Auth\Reminders\RemindableInterface; 

class User extends Eloquent implements UserInterface, RemindableInterface 
{ 
    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'gebruikers'; 


    /** 
    * The attributes excluded from the model's JSON form. 
    * 
    * @var array 
    */ 
    protected $hidden = array('wachtwoord'); 

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

    /** 
    * Get the password for the user. 
    * 
    * @return string 
    */ 
    public function getAuthPassword() 
    { 
     return $this->wachtwoord; 
    } 

    /** 
    * Get the token value for the "remember me" session. 
    * 
    * @return string 
    */ 
    public function getRememberToken() 
    { 
     return $this->aandenken_onthouden; // okay I made this up based on Google translate and some guesswork, use your own version! 
    } 

    /** 
    * Set the token value for the "remember me" session. 
    * 
    * @param string $value 
    * @return void 
    */ 
    public function setRememberToken($value) 
    { 
     $this->aandenken_onthouden = $value; 
    } 

    /** 
    * Get the column name for the "remember me" token. 
    * 
    * @return string 
    */ 
    public function getRememberTokenName() 
    { 
     return 'aandenken_onthouden'; 
    } 

    /** 
    * Get the e-mail address where password reminders are sent. 
    * 
    * @return string 
    */ 
    public function getReminderEmail() 
    { 
     return $this->email; 
    } 
} 
+0

Спасибо за ваш ответ. Я добавила getAuthPassword к моей модели без успеха. Что мне нужно изменить в моем коде для этого решения? – JelleP

+0

@JelleP Я добавил свое мышление к ответу. Пожалуйста, простите мое полное незнание голландского языка и вместо этого сделайте выбор слов! Погрузитесь! – alexrussell

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