使用Laravel 4 Auth和自定义表名

时间:2014-04-10 09:06:58

标签: php authentication laravel

我正在基于现有数据库创建一个新的laravel 4后端。然后我有一个名为'FormMembers'的表,其中包含我的成员的电子邮件和密码。

我想使用Auth :: functions这样的函数:

$credentials = array(
    'sEmail' => Input::get('email'),
    'sPassword' => Input::get('password')
);

if (Auth::attempt($credentials)) {
    return Response::json(Auth::user());
} else {
    return Response::json(array('flash' => 'invalid password or email.'), 500);
}

所以我将 auth.php 中的表格字段从“用户”更改为“FormMembers”,并对用户模型执行了相同的操作。但是当调用Auth :: user()时我得到了错误:

{"error":{"type":"ErrorException","message":"Undefined index: password","file":"\/home\/www\/accred\/web\/vendor\/laravel\/framework\/src\/Illuminate\/Auth\/EloquentUserProvider.php","line":75}}

你知道我怎么能管理它吗​​? 感谢

1 个答案:

答案 0 :(得分:1)

凭据数组中雄辩的user provider requires一个password字段。您传递了一个键为sPassword的数组。

你应该能够做到

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

Auth::attempt($credentials);

并从User eloquent模型处理其余部分。即使您的用户表具有不同的列。

编辑: Auth :: attempt()函数由Illuminate的Guard类处理。 这将调用retrieveByCredentials,然后调用实现validateCredentials的类的UserProviderInterface方法。默认情况下,这是EloquentUserProvider

retrieveByCredentials方法使用除凭证数组的密码密钥以外的所有密钥。它返回一个User eloquent模型对象。所以使用 那里你的'电子邮件'密钥。

在eloquent用户提供程序上调用的validateCredentials方法检查凭证数组中password字段的哈希是否与从您getAuthPassword方法检索到的哈希密码匹配用户对象,它需要实现,因为它实现了UserInterface

因此,您应该覆盖User类上的getAuthPassword方法。

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

像这样返回存储在DB中的散列密码。

当然,您的密码应该像Hash :: make一样进行哈希处理。如果不是:

  1. 让所有用户重置密码
  2. 重新实施BcryptHasher