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

问题描述 投票:1回答:3

我创建了一个带有服装字段名称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 )

保存前密码为哈希值。

laravel laravel-4
3个回答
1
投票

因为您更改了密码字段的名称,所以您需要创建自定义用户提供程序并在配置文件中注册它。

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

所以在某处创建一个类是app文件夹,如下所示:

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
        ],
    ],

我希望这能帮到您。


0
投票

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

(Qazxswpoi)


0
投票

只需覆盖Proof中的username函数并返回您的用户名字段,如下所示:

LoginController

除了正确执行的class LoginController extends Controller { . . . public function username() { return "fld_Username"; } } 方法之外,无需更改任何其他内容。

我希望这能帮到您。

© www.soinside.com 2019 - 2024. All rights reserved.