我正在尝试使用Laravel的Auth类,但每次尝试登录用户时,该方法都会返回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',
),
);
数据库有电子邮件&amp;密码字段,密码字段是varchar(60)。 每当我将登录信息发送到/ login时,它都会返回“Wrong”。 我真的不知道这里有什么不对吗?
答案 0 :(得分:6)
您的代码是错误的,因为您将错误的变量传递给Auth::attempt()
。该方法需要一个包含密钥用户名,密码的数组,并可选择记住。鉴于此,您的上述代码应为:
Route::post('login', function()
{
$credentials = [
'username' => Input::get('email'),
'password' => Input::get('password')
];
dd(Auth::attempt($credentials));
});
希望有所帮助。
此外,我还会为您提供额外代码的摘要,以改善您的工作流程。存储新用户的路线:
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');
});
然后在您的用户模型中添加方法
public function setPasswordAttribute()
{
$this->password = Hash::make($this->password);
}
这样,密码就会在每次设置时自动散列
答案 1 :(得分:3)
在尝试之前不要散列密码:
$user = array(
'email' => Input::get('email'),
'password' => Input::get('password')
);
if (Auth::attempt($user)) {
//return Redirect::intended('dashboard');
return "ok.";
} else {
return "Wrong.";
}
答案 2 :(得分:1)
这不起作用,因为auth :: attempt使用bcrypt将密码转换为hash,并在users表中查找该hash以匹配。
简而言之,密码应该是存储在数据库表中的哈希值,用于auth ::尝试工作。
这就是你的if()条件失败的原因。
您可以使用bcrypt(密码)将密码存储为数据库中的哈希值,然后使用auth :: attempt
以下是来自laravel docs
https://laravel.com/docs/5.2/authentication#authenticating-users
attempt方法接受一个键/值对数组作为其第一个 论点。数组中的值将用于查找用户 你的数据库表。因此,在上面的示例中,用户将是 通过电子邮件列的值检索。如果找到用户,则 存储在数据库中的哈希密码将与之进行比较 散列密码值通过数组传递给方法。如果是两个 将启动散列密码匹配经过身份验证的会话 用户。
如果身份验证成功,则尝试方法将返回true。 否则,将返回false。
答案 3 :(得分:0)
您应该在模型类中实现laravel提供的UserInterface
类:
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
class User extends Eloquent implements UserInterface, RemindableInterface
{
请记住,它有2个抽象方法,你应该在你的模型中声明。您可以关注原始User.php
模型
答案 4 :(得分:0)
检查密码长度。数据库中必须为60或更高。