Laravel自定义认证用户字段

3

我创建了一个表格,并使用自定义字段名 fld_ID, fld_Username, fld_Password,但是在简单的laravel身份验证中无法使用这些字段类型,所以我在用户模型中定义了我的ID字段名称,除了laravel-4:

protected $primaryKey = 'fld_ID';

并且对于密码名称:
public function getAuthPassword() {
    return $this->attributes['fld_Password'];
}

最后,在我的“文章操作定义”中,为尝试定义了一个用户名类型。
$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 )

并且密码在保存之前被哈希处理。


我不知道,但是在Auth::attempt后面缺少一个右括号来关闭if语句。 - Hao Luo
那不是问题,我已经编辑了那一行,谢谢。 - Mehdi Hosseini
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会在您传递的数组中查找键名为"password"的值作为密码。

(证明)


顺便说一下,我不应该改变它们,还有很多开发人员想要自定义字段名称https://dev59.com/8HPYa4cB1Zd3GeqPkY9O和http://forums.laravel.io/viewtopic.php?pid=49835等等... - Mehdi Hosseini
1
好的,那么您需要扩展UserProviderInterface,并将其实现与默认的EloquentUserProvider交换。不要忘记注册您的auth驱动程序。这可能看起来像用大炮打死一只苍蝇,但你必须做你必须做的事情。但实际上,对于大多数人来说,那只苍蝇只是一个灰尘颗粒,如果你知道我的意思。 - Hao Luo
这个 https://github.com/laravel/framework/blob/master/src/Illuminate/Auth/EloquentUserProvider.php#L53-L55 和 Guard 实例怎么样? - Mehdi Hosseini
点击此处以扩展Auth)您是正确的,Auth根据凭证数组的键检索用户,同时过滤掉密码。 - Hao Luo

0

只需覆盖 LoginController 中的 username 函数并返回您的用户名字段,就像这样:

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

除了你刚刚正确完成的getAuthPassword方法之外,不需要更改任何其他内容。

希望这能帮到你。


抱歉,我不知道这是什么意思。 - Mehdi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接