Laravel自定义身份验证用户字段

时间:2014-01-14 07:33:58

标签: laravel laravel-4

我创建了一个带有服装字段名称fld_ID, fld_Username, fld_Password的表字段,但我不能在简单的laravel身份验证上使用此字段类型,因此我在用户模型上定义了我的ID字段名称,除了laravel -4:

protected $primaryKey = 'fld_ID';

和密码名称:

public function getAuthPassword() {
    return $this->attributes['fld_Password'];
}

最后是我在Post Action上的用户名定义了尝试的用户名类型:

$input = Input::all();
$user['fld_Username'] = $input['fld_Username'];
$user['fld_Password'] = $input['fld_Password'];

 if (Auth::attempt($user)){
 ....Some Code Here... :)
 }

但我仍然遇到问题并且Auth::attempt返回false,我的上一个查询日志是这样的:

Array ( [query] => select * from `tbl_users` where `fld_Username` = ? and `fld_Password` = ? limit 1 [bindings] => Array ( [0] => username [1] => password )
保存前

和密码已经过哈希。

3 个答案:

答案 0 :(得分:1)

由于您更改了密码字段的名称,因此需要创建一个自定义用户提供程序并将其注册在配置文件中。

正如您在vendor\laravel\framework\src\Illuminate\Auth\EloquentUserProvider.php第138行中看到的那样,密码字段是硬编码的,没有其他更改方法。

因此在某处放置一个类的应用程序文件夹是这样的:

class CustomUserProvider extends EloquentUserProvider
{

    public function retrieveByCredentials(array $credentials)
    {
        if (isset($credentials['fld_Password'])) {
            unset($credentials['fld_Password']);
        }

        return parent::retrieveByCredentials($credentials);
    }

    public function validateCredentials(UserContract $user, array $credentials)
    {
        $plain = $credentials['fld_Password'];
        return $this->hasher->check($plain, $user->getAuthPassword());
    }

}

现在,您需要将此用户提供程序介绍给laravel。只需将其添加到app\Providers\AuthServiceProvider.php

class AuthServiceProvider extends ServiceProvider
    //...

    public function boot()
    {
       \Auth::provider('CustomUserProvider', function ($app, array $config) {
            return new CustomUserProvider($app['hash'], $config['model']);
        });
    }

    //...
}

再走一步。在config/auth.php中,编辑providers部分,如下所示:

    'providers' => [
        'users' => [
            'driver' => 'CustomUserProvider', // make sure you change this
            'model' => CustomUserModel::class, // here is your custom model
        ],
    ],

我希望这会对您有所帮助。

答案 1 :(得分:0)

传递给attempt的数组只是一个数组;它与您的数据库表无关。您不必使用'fld_Username''fld_Password'。而只需使用$user['username']$user['password'] Laravel正在寻找“密码”这个词作为你传递的数组中的密钥,看看哪个是密码。

Proof

答案 2 :(得分:0)

只需重写username中的LoginController函数,然后返回您的用户名字段,就像这样:

class LoginController extends Controller
{
    .
    .
    .
    public function username()
    {
        return "fld_Username";
    }
}

除了您刚才正确执行的getAuthPassword方法外,无需更改其他任何内容。

我希望这会对您有所帮助。