2016-05-17 15 views
6

Używam systemu ręcznego uwierzytelniania w języku laravel. Przesyłanie formularza przekierowuje na tę trasę pokazaną poniżej. A w funkcji authenticate() nazwa i hasło nigdy nie pasują do wcześniej zapisanego. tj. Auth::attempt jest zawsze fałszywe.Ręczne uwierzytelnianie Laravel: Auth :: próba zawsze fałszywa

Route::post('/logintest', '[email protected]'); 
    Route::get('/home', ['middleware' => 'auth', function() { 
    echo "home page";}); 
}]); 

Uwierzytelnij funkcja:

public function authenticate(Request $request) 
     { 
      $input=$request->all(); 
      $password=$input['password']; 
      $name=$input['name']; 

      if (Auth::attempt(['Name' => $name, 'Password' => $password])){ 
      return redirect()->intended('/home'); 
     } else 
      { 
       return redirect('/login')->with('message','Error logging in!'); 
      } 
     } 

Mam zarejestrowany użytkownikowi w ten sposób. hasło jest mieszane za pomocą bcrypt(). funkcjonować. ale w funkcji authenticate() porównuję zwykłe hasło. gdzieś czytam Auth automatycznie go obsługuje. Czy jest coś, co powinienem zmienić w config/auth.php, ponieważ użyłem nazwy do uwierzytelnienia zamiast nazwy użytkownika?

public function register(Request $request) 
{ 
    $input=$request->all(); 
    $password=bcrypt($input['password']); 
    $name=$input['name']; 
    $insert= User::insert(['Name'=>$name,'Password'=>$password]); 
    return redirect('/login') 
      ->with('message','successfully Registered.'); 
} 
+0

Czy możesz nam pokazać plik tras? – VipindasKS

+0

@VipindasKS Pokazałem je u góry. – micky

+0

Czy to jedyne zdefiniowane trasy.Po prostu upewnij się, że nie powoduje konfliktów z żadnymi innymi trasami. Zwłaszcza, jeśli zrobiłeś php rzemieślnika zrobić: auth wcześniej. – VipindasKS

Odpowiedz

0

Wszystko wydaje się być poprawne.

Jakie są nazwy kolumn w tabeli użytkowników?

W nazwach jest rozróżniana wielkość liter. Upewnij się więc, że rzeczywiście są one Name i Password, a nie name i password.

+0

nie ma problemu z nazwami kolumn. – micky

+0

W 'public function authenticate (Request $ request)' spróbuj zmienić '$ password = $ input ['password'];' na '$ password = bcrypt ($ input ['password']);' – linuxartisan

3

Sprawdź kod poniżej

public function authenticate(Request $request) 
{ 
    $password = $request->input('password'); 
    $name = $request->input('name'); 

    if (Auth::attempt(['name' => $name, 'password' => $password])) 
    { 
      return redirect()->intended('/home'); 
    } 
    else 
    { 
      return view('login')->withErrors('Error logging in!'); 
    } 
} 
+0

wykrył, że 'Auth :: próba 'jest fałszywa z powodu złego hasła. Użyłem bcrypt() podczas rejestracji użytkowników. '$ password = bcrypt ($ input ['password']);' jak mogę go użyć tutaj, aby uzyskać dostęp? – micky

+1

$ password = Input :: get ('password'); $ hashed = Hash :: make ($ password); –

+0

próbowałem tego. nie rozwiązał. – micky

0

Dlaczego nie można użyć polecenia php artisan make:auth? Sprawi, że wszystko, czego potrzebujesz.

0
Route::group(['middleware' => ['web']], function() { 
    Route::post('/logintest', '[email protected]'); 
}); 
  1. proszę skontaktować się z powyższą zmianą swojej Routes.php, o ile używasz wersji 5 lub 5.2

  2. Upewnij się, że nazwy pól tabeli użytkownicy są „Name” i „Password” jeszcze go zaktualizuj.

  3. Sprawdź długość pola twojego pola Password (w bazie danych, users tabela). Powinien on posiadać długie, zaszyfrowany hasłem coś takiego $2y$10$eM.kmjTwEIykhNUqMsNzMud0E6eO6RUYAzTqirrbozY1zdhVwQmsC conajmniej (varchar (60))

Byłoby lepiej, gdyby można było pokazać nam schematu tabeli użytkowników

  1. Wreszcie, upewnij się, że wprowadzeniu prawidłowego hasła (jak nie widzę dużo błędów w kodzie)
+0

sprawdzone wszystkie twoje punkty. wciąż nic nie pomaga. – micky

+0

Czy możesz wyświetlić strukturę tabeli dla tabeli użytkowników? – VipindasKS

+0

Tak. Zmieniłem "Hasło" na "hasło" i nagle zadziałało. Dziękuję za Twój wysiłek. – micky

3

jest problem z nazwiskami. [email protected] pobiera wszystkie te poświadczenia, z wyjątkiem password (wielkość liter ma znaczenie), że przekazujesz w tej tablicy i uruchamia kwerendę where (W ten sposób można dodać dodatkowe ograniczenia do próby, ponieważ są one po prostu warunkami). Jeśli znajdzie model, wykona sprawdzenie hash na password poświadczeń (z uwzględnieniem wielkości liter), które przekazałeś, i hashowanego hasła modelu, które otrzyma od $model->getAuthPassword().

To pole w poświadczeniach jest szczególne, ponieważ jest tym, czego potrzebuje Auth, więc wie, jakie pole w poświadczeniach ma być hasłem.Nie koreluje bezpośrednio z polem użytym w tabeli users i musi mieć nazwę o nazwie password w tablicy poświadczeń. Pozostałe pola w przekazywanych poświadczeniach, oprócz "hasła", korelują bezpośrednio z polami w tabeli użytkowników, ponieważ są warunkami zapytania do bazy danych w tej tabeli.

Musisz zadeklarować w swoim modelu użytkownika, jeśli używasz pola innego niż "hasło" w tabeli jako hasła. W twoim przypadku używasz "Hasła". (Jest to wielkość liter)

class User .... 
{ 
    ... 
    public function getAuthPassword() 
    { 
     return $this->Password; // case sensitive 
    } 
    ... 
} 

Po przejściu poświadczenia przekazać tekst jako zwykły hasło będzie hash_check dzieje, a nie bezpośrednie porównanie.

Możesz nazwać pola, które chcesz, na swoim prawdziwym stole, po prostu musisz uświadomić to sobie Eloquentowi.

0

Jeśli chcesz użyć Name jako unikalną nazwę użytkownika i hasło fiendname jak Password

Można to zrobić w ten sposób ..

W swojej AuthController dodać tę metodę

public function loginUsername() 
{ 
    return 'Name'; 
} 

A w swojej Użytkownika model dodaj tę metodę:

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

Mam nadzieję, że to zadziała.

+0

Nie używają domyślnego AuthController. – lagbox

1

Ponieważ używasz nazwy zamiast e-mail (domyślnie) jako nazwy użytkownika do uwierzytelniania. Powinieneś dodać właściwość $username do swojego AuthController.

.... 

class AuthController extends Controller 
{ 


use AuthenticatesAndRegistersUsers, ThrottlesLogins; 

/** 
* Override the input name 'email' 
* Change it as the name on blade 
* 
* @var string $username 
*/ 
protected $username = 'Name'; 

.... 
} 

Alternatywnie, można zastąpić loginUsername() metodę z Illuminate\Foundation\Auth\AuthenticatesUsers cechy.

.... 

class AuthController extends Controller 
{ 


use AuthenticatesAndRegistersUsers, ThrottlesLogins; 

/** 
* Get the login username to be used by the controller. 
* 
* @return string 
*/ 
public function loginUsername() 
{ 
    return 'Name'; 
} 

.... 
} 

Jak mówili inni, sprawa ma znaczenie. Następnie należy zastąpić getAuthPassword() metodę z Illuminate\Auth\Authenticatable cechy modelu User

.... 

class User extends Authenticatable 
{ 

.... 

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

Nie używają AuthController, a jeśli tak, to omijają to wszystko, ponieważ metoda 'proba' w ich kodzie jest odręcznie napisana. – lagbox

0

spróbować przełączania na małe indeksy w tej linii:

//... 
if (Auth::attempt(['Name' => $name, 'Password' => $password])) { 
//... 

Do

//... 
if (Auth::attempt(['name' => $name, 'password' => $password])) { 
//... 
0

Należy napisać hasło użytkownika znak p małymi literami.

Zamień

Auth::attempt(['Name' => $name, 'Password' => $password]) 

do

Auth::attempt(['Name' => $name, 'password' => $password]) // 'p' is in small letter here. 

check to link również.

Powiązane problemy