【问题标题】:Laravel custom authentication user fieldsLaravel 自定义认证用户字段
【发布时间】:2014-02-02 04:36:29
【问题描述】:

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

密码在保存前经过哈希处理。

【问题讨论】:

  • idk,但是在 Auth::attempt to close the if 之后缺少右括号。
  • 这不是我编辑那行的问题,tnx。

标签: laravel laravel-4


【解决方案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
        ],
    ],

希望对你有所帮助。

【讨论】:

    【解决方案2】:

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

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

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

    希望对你有帮助。

    【讨论】:

    • opppps 4 sal pish in soalo porsidi :DDD sry nadidam :)
    【解决方案3】:

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

    (Proof)

    【讨论】:

    猜你喜欢
    • 2017-11-01
    • 2018-05-11
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    相关资源
    最近更新 更多