2014-09-27 13 views
10

Chciałbym zmienić pole hasła w bazie danych podczas korzystania z uwierzytelniania Laravel. Chcę, aby moja kolumna w tabeli users miała nazwę passwd, a nie password. Próbowałem uruchomić coś takiego:Jak zmienić/Nazwa pola hasła niestandardowego dla uwierzytelniania użytkownika Laravel 4 i Laravel 5

Auth::attempt(array(
    'user_name' => 'admin', 
    'passwd' => 'hardpass', 
)); 

ale to nie działa.

Próbowałem też dodać w User modelu następującą funkcję:

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

ale też niczego nie zmienia. Użytkownik nadal nie jest uwierzytelniany. Czy w Laravel można zmienić nazwę pola hasła w bazie danych?

+0

@JarekTkaczyk To prawda, ale nie ma tam informacji dla użytkowników, którzy chcą mieć kolumnę zwyczaj hasła w bazie danych. OP wspomniał tylko o użyciu 'getAuthPassword', ale dla użytkownika, który szuka rozwiązania, nadal nie będzie wiedział, co robić. Pomyślałem, że ten Q & A będzie pomocny dla innych użytkowników, aby rozwiązać ten problem krok po kroku. –

+1

Po prostu wskazówka - w większości przypadków najbardziej wartościowe odpowiedzi są krótkie i spójne, które dokładnie rozwiązują problem. –

+0

@ MarcinNabiałek uratowałeś mi życie To głupie obyczaje w moim projekcie doprowadzały mnie do bananów – caro

Odpowiedz

45

Informacje

Możesz łatwo zmienić wszystkie pozostałe pola w bazie danych i używać ich do uwierzytelniania. Jedyny problem dotyczy pola password.

Faktycznie, pole password jest w jakiś sposób mocno zakodowane w Laravel (ale nie tak, jak wielu uważa), więc nie można po prostu przekazać tablicy, gdy przekazywałeś swoje pytanie.

Domyślnie jeśli przejdą tablicę attempt (i prawdopodobnie inne funkcje uwierzytelniania, takie jak validate lub once) jeśli robisz to w ten sposób:

Auth::attempt(array(
    'user_name' => 'admin', 
    'password' => 'hardpass', 
)); 

domyślny sterownik Eloquent będzie uruchomić następujące zapytanie:

select * from `users` where `user_name` = 'admin' limit 1; 

Po uzyskaniu tych danych z bazy danych, będzie porównywać podane hasło z właściwością hasła dla obiektu użytkownika, który został utworzony.

Ale jeśli po prostu użyć:

Auth::attempt(array(
    'user_name' => 'admin', 
    'passwd' => 'hardpass', 
)); 

następujące zapytanie zostanie uruchomiony:

select * from `users` where `user_name` = 'admin' and `passwd` = 'hardpass' limit 1; 

i żaden użytkownik nie będzie można znaleźć w bazie danych (w passwd przechowywać hashed hasło). Wynika to z faktu, że Eloquent usuwa z zapytania password, ale używa innych danych do uruchomienia zapytania. Również jeśli spróbujesz tutaj użyć 'passwd' => Hash:make($data['password']), chociaż użytkownik zostanie znaleziony, porównanie hasła nie będzie działać.

Rozwiązanie

Rozwiązanie jest dość proste. Trzeba uruchomić Auth::attempt takiego:

Auth::attempt(array(
    'user_name' => 'admin', 
    'password' => 'hardpass', 
)); 

Jak widać ci nadal przechodzą password jako klucz (choć ta kolumna nie wyjść w tabeli users), ponieważ tylko w ten sposób Eloquent kierowca nie będzie go używać do budowania zapytania .

Teraz w User modelu (app/models/User.php) Plik należy dodać następującą funkcję:

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

Jak widać użyć tutaj kolumnę, która naprawdę istnieje w bazie danych: passwd.

Używając go w ten sposób, możesz mieć kolumnę z hasłem o nazwie cokolwiek chcesz i nadal możesz używać do tego domyślnego sterownika Eloquent.

Przykładowe dane do przetestowania

Stworzyłem dla niego bardzo prosty test.

Wystarczy zastąpić plik app/routes.php z następujących czynności:

Route::get('/', function() { 

    if (Auth::check()) { 
     echo "I'm logged in as " . Auth::user()->user_name . "<br />"; 
     echo "<a href='/logout'>Log out</a>"; 
    } else { 
     echo "I'm NOT logged in<br />"; 


     Auth::attempt(array(
      'user_name' => 'admin', 
      'password' => 'hardpass', 
     )); 


     if (Auth::check()) { 
      echo "Now I'm logged in as " . Auth::user()->user_name . "<br />"; 
      echo "<a href='/logout'>Log out</a>"; 
     } else { 
      echo "I'm still NOT logged in<br />"; 
     } 
    } 


}); 

Route::get('/logout', function() { 
    Auth::logout(); 
    return "You have been logged out"; 
}); 


Route::get('/db', function() { 

    if (!Schema::hasTable('users')) { 


     Schema::create('users', function ($table) { 
      $table->engine = 'InnoDB'; 
      $table->increments('id'); 
      $table->string('user_name', 60)->unique(); 
      $table->string('passwd', 256); 
      $table->rememberToken(); 
      $table->timestamps(); 
     }); 

     DB::table('users')->insert(
      [ 
       [ 
        'user_name' => 'admin', 
        'passwd' => Hash::make('hardpass'), 
       ] 
      ] 
     ); 
    } 

    echo "Table users has been created"; 
}); 
  1. Tworzenie pustej bazy danych i zestaw danych połączeń w app/config/database.php
  2. Teraz można uruchomić /db url np http://localhost/yourprojectname/db tylko do tworzenia użytkowników stół.
  3. Teraz możesz uruchomić adres URL / na przykład http://localhost/yourprojectname/ - jak widzisz użytkownik jest zalogowany, nawet jeśli w tabeli users w bazie danych nie masz kolumny password (dane do uwierzytelnienia zostały przekazane jako ciągi bez formularzy, ale oczywiście w prawdziwej aplikacji dodasz je). Ten adres URL można uruchomić jeszcze raz - jak widać, użytkownik jest nadal zalogowany, więc działa zgodnie z oczekiwaniami.
  4. Jeśli klikniesz na Log out linku, zostanie wylogowany

laravel 5 zmian do wyżej

To rozwiązanie zostało przetestowane w Larave 4.2.9 (wszystko jak wyżej), a także w laravel 5. w Laravel5 wszystko działa tak samo, ale trzeba o edycji plików kursu w różnych ścieżek:

  1. User model jest w app/User.php pliku
  2. trasy są w app/Http/routes.php pliku
  3. plik konfiguracyjny bazy danych jest w config/database.php pliku