2013-06-14 19 views
8

私はLaravelのAuthクラスを試していますが、ユーザーにログインしようとするたびにfalseを返します。ここに私のコードです:Laravel 4 Auth :: attempt()は常にfalseを返します

routes.phpの

Route::get('new-user', function() { 
    return View::make('register'); 
}); 

Route::post('new-user', function() { 
    $name = Input::get('name'); 
    $email = Input::get('email'); 
    $password = Hash::make(Input::get('password')); 

    $user = new User; 
    $user->name = $name; 
    $user->email = $email; 
    $user->password = $password; 

    $user->save(); 
});  

Route::get('login', function() { 
     return View::make('login'); 
    }); 

    Route::post('login', function() { 

     $user = array(
      'email' => Input::get('email'), 
      'password' => Hash::make(Input::get('password')) 
     ); 

     if (Auth::attempt($user)) { 
      //return Redirect::intended('dashboard'); 
      return "ok."; 
     } else { 
      return "Wrong."; 
     } 

    }); 

ビュー/ login.blade.php

{{ Form::open(array('url' => 'login', 'method' => 'post')) }} 

    <h1>Login:</h1> 

    <p> 
     {{ Form::label('email', 'Email: ') }} 
     {{ Form::text('email') }}<br /> 

     {{ Form::label('password', 'Password: ') }} 
     {{ Form::password('password') }}<br /> 
    </p> 

    <p> 
     {{ Form::submit('Login') }} 
    </p> 

{{ Form::close() }} 

設定データベースが電子メールを持っている/ auth.php

return array(

    'driver' => 'eloquent', 
    'model' => 'User', 
    'table' => 'users', 
    'reminder' => array(
     'email' => 'emails.auth.reminder', 'table' => 'password_reminders', 
    ), 

); 

&パスワードフィールド、およびパスワードフィールドはvarchar(60)です。 私は/ loginにログイン情報を送るたびに、私に「間違って」返されます。 私は本当にここで何が間違って見ることができないのですか?

答えて

3

しようとする前にパスワードをハッシュしないでください:あなたはAuth::attempt()に間違った変数を渡しているので、

$user = array(
     'email' => Input::get('email'), 
     'password' => Input::get('password') 
    ); 

    if (Auth::attempt($user)) { 
     //return Redirect::intended('dashboard'); 
     return "ok."; 
    } else { 
     return "Wrong."; 
    } 
+0

それでも私はfalse( "間違っています")を返します。 – John

+1

ドキュメント(http://four.laravel.com/docs/security#storing-passwords)によると、パスワードは試みられません。私はこれが一つの問題だと確信していますが、複数の問題があるかもしれません。パスワードがユーザテーブルに正しく保存されていることを確認してください。 –

+0

データベースにユーザを保存する方法は次のとおりです。 'Route :: post( 'new-user'、function(){ $ name = Input :: get( 'name'); $ email = Input: $ password = Hash :: make(Input :: get( 'password')); $ user = new User; $ user-> name = $ name; $ user->メール= $メール; する$ user->パスワード= $パスワード; する$ user->は、(保存); }); ' 私はいけない」申し訳ありませんが、正しくここにコードを表示する方法を知っています。 – John

6

あなたのコードが出て盗聴されています。この方法では、username、passwordというキーを持つ配列が必要です。そのため、上記のコードは次のようになります。

Route::post('login', function() 
{ 
    $credentials = [ 
     'username' => Input::get('email'), 
     'password' => Input::get('password') 
    ]; 

    dd(Auth::attempt($credentials)); 
}); 

また、作業フローを改善するためのコードを追加します。パスワードは自動的にそれが

0

を設定していますたびにハッシュ化されますあなたが提供UserInterfaceクラスを実装する必要があり

public function setPasswordAttribute() 
{ 
    $this->password = Hash::make($this->password); 
} 

メソッドを追加するには、ユーザーのモデルに続いてこの道を

Route::post('register', function() 
{ 
    $input = Input::only(['username', 'email', 'password']); 

    // validate data 

    Eloquent::unguard(); 

    $user = User::create($input); 

    Auth::loginUsingId($user->id); 

    return Redirect::to('dashboard'); 
}); 

:ルートは、新しいユーザーを保存しますモデルクラス内のlaravelによって:

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

class User extends Eloquent implements UserInterface, RemindableInterface 
{ 

また、モデルに宣言する必要がある2つの抽象メソッドがあることに注意してください。オリジナルに従うことができますUser.phpモデル

0

パスワードの長さを確認してください。データベースでは60以上でなければなりません。

0

auth :: attemptはパスワードをbcryptを使用してハッシュに変換し、一致するユーザーテーブルのハッシュを探しますので、これは機能しません。

要するに、パスワードは認証のためのデータベーステーブルに保存されたハッシュでなければなりません::試みてください。

これはif()条件が失敗する理由です。

データベースにハッシュとしてパスワードを保存してから認証を使用するようにbcryptの(パスワード)を使用することができます::試み以下

が試みメソッドが受け入れるlaravelドキュメント

https://laravel.com/docs/5.2/authentication#authenticating-users

からです最初の 引数としてキー/値のペアの配列。配列内の値は、データベーステーブル のユーザーを見つけるために使用されます。したがって、上記の例では、ユーザは というメール列の値で取得されます。ユーザーが見つかると、データベースに格納されている ハッシュされたパスワードが、 ハッシュされたパスワード値と比較され、配列を介してメソッドに渡されます。 2つのパスワードがハッシュされたパスワードが一致すると、ユーザーは の認証セッションが開始されます。

認証が成功した場合、試行メソッドはtrueを返します。 それ以外の場合は、falseが返されます。

関連する問題