2016-03-09 48 views
1

我有通过从我的视图发送到控制器的发布请求传递的用户名和密码。负责处理帖子请求的控制器:无法验证Laravel中的用户:'无效的用户名或密码'

public function postLogin(Request $request) { 
     $this->validate($request, [ 
      'username' => 'required', 
      'password' => 'required' 
     ]); 

     if (!Auth::attempt([ 
      'username' => $request['username'],      
      'password' => $request['password'] ])) { 
      return redirect()->back()->with(['fail' => 'invalid username or password']);  
     } 

     return redirect()->route('auth.dashboard');        
    } 

问题是我总是收到'失败'消息:'无效的用户名或密码'。

我看着phpmyadmin里面的表,用户名和密码非常简单(用户名:Admin &密码:12345)。

这是管理员表的数据库:

class CreateAdminsTable extends Migration 
{ 

    public function up() 
    { 
     Schema::create('admins', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->timestamps(); 
      $table->string('username')->unique(); 
      $table->string('password'); 
      $table->rememberToken(); 
     }); 
    } 

    public function down() 
    { 
     Schema::drop('admins'); 
    } 
} 

作为参考,我使用Laravel 5.2

更新1:在使用者经由注册控制器,其存储的用户名中创建和密码在数据库中。这里是控制器:

public function postRegister(Request $request) { 

     $admin = new Admin(); 

     $this->validate($request, [ 
      'username' => 'required|unique:admins|max:30|min:3', 
      'password' => 'required|min:5', 
      'password_confirm' => 'required'   
     ]); 

     $password = $request['password']; 
     $passwordConfirm = $request['password_confirm']; 

     if ($password !== $passwordConfirm) { 
      return redirect()->back()->with(['fail' => 'password fields do not match!']); 
     }  
     $hashedPassword = password_hash($password, PASSWORD_BCRYPT); 

     $admin->username = $request['username']; 
     $admin->password = $hashedPassword; 
     $admin->save(); 

     return redirect()->route('index')->with(['success' => 'Successfully created account!']);  

    } 
+0

我更喜欢使用Hash :: make而不是password_hash。因为在传递给password_hash的Hash :: make中有一个额外的选项。这就是为什么哈希没有匹配 – cresjie

+0

修复它!请输入这个答案,以便我可以upvote并勾选它。 – Frosty619

回答

1

我更喜欢使用Hash :: make而不是password_hash。因为在传递给password_hash的Hash :: make中有一个额外的选项。这就是为什么哈希没有匹配

+0

干杯!这解决了它。 – Frosty619

0

请更改以下代码的登录功能。

public function postLogin(Request $request) { 
     $this->validate($request, [ 
      'username' => 'required', 
      'password' => 'required' 
     ]); 

     if (Auth::attempt([ 
      'username' => $request['username'],      
      'password' => $request['password'] ],$remember)) { 
      return redirect()->route('auth.dashboard');    
     } 
     return redirect()->back()->with(['fail' => 'invalid username or password']); 

    } 

注意:这里$remember应该是1/0或TRUE/FALSE。

希望这会帮助你。

+0

我复制粘贴你的代码,我得到了错误“未定义的变量记住”,然后我将它设置为true,并将它传递给尝试方法,并得到了和以前一样的错误。 – Frosty619

+0

@ Frosty619请确保您的数据库中的密码是什么,是指哪种格式? Laravel使用散列函数在数据库中存储密码。而且你仍然会得到相同的错误,然后将散列值存储在数据库的密码列中,然后重试。 –

1

您在Auth :: attempt中总是会出现错误,因为数据库中的密码不是哈希值。首先将密码存储在数据库中。你可以使用播种机为了在种子数据库

class UserSeeder extends Seeder 
{ 
    public function run() 
    { 
     //your admin model 
     Admin::create([ 
      'username' => 'admin', 
      'password' => Hash::make(123) 
     ]); 
    } 
} 

希望这会有所帮助。

+0

根据布鲁斯的评论,我对密码进行哈希处理。请参阅上面的更新! – Frosty619

+0

另外,我不想使用Seeder,因为我希望能够让用户注册,但是,当我尝试上面的代码时,它运行良好。 – Frosty619

0

Laravel将会期待散列的密码。 所以如果phpmyadmin中的密码是可见的,它将无法在Laravel中验证。我期望在phpmyadmin的密码看起来像这样$2y$13$Cn0gwiUfg2mq5Y3/V98aB.NZ4GJqjbwhvKlsSAOYkVNHKlWRmwZ1W

+0

根据您的评论,我在我的注册控制器中添加了password_hash方法。我创建了一个新的管理员,其密码存储为phpmyadmin中的散列字符串,但我仍然收到相同的错误。请参阅更新以获取更多信息。谢谢! – Frosty619

+0

试试这个答案http://stackoverflow.com/a/35884495/21460因为我只有laravel的表面知识 –

+0

不用担心,谢谢你的帮忙!我不想使用Seeder,因为我希望用户能够注册。 – Frosty619

相关问题