【问题标题】:Laravel overriding EloquentUserProvider to change password field name in validateCredentials()Laravel 覆盖 EloquentUserProvider 以更改 validateCredentials() 中的密码字段名称
【发布时间】:2016-03-01 16:29:44
【问题描述】:

我已经设法通过覆盖各种类/方法来更改代码中的密码字段。但是我在尝试覆盖 EloquentUserProvider 并且它是 validateCredentials() 方法后,我一直收到错误 -

ErrorException in AuthUserProvider.php line 15:
Argument 1 passed to App\Providers\AuthUserProvider::__construct() must be an instance of App\Helpers\Sha1Hasher, instance of Illuminate\Foundation\Application given

我创建了一个覆盖 App\Providers\AuthUserProvider.php -

namespace App\Providers;

use Illuminate\Contracts\Auth\Authenticatable as UserContract;
use App\Helpers\Sha1Hasher as HasherContract;
use Illuminate\Auth\EloquentUserProvider;

class AuthUserProvider extends EloquentUserProvider
{
/**
 * AuthUserProvider constructor.
 * @param HasherContract $hasher
 * @param string $model
 */
public function __construct(HasherContract $hasher, $model)
{
    parent::__construct($hasher, $model);
}

/**
 * Validate a user against the given credentials.
 *
 * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
 * @param  array  $credentials
 * @return bool
 */
public function validateCredentials(UserContract $user, array $credentials)
{
    // $plain = $credentials['sha_pass_hash'];
    // return HasherContract::check(...);;
}
}

使用 Laravel 5.2.22。

【问题讨论】:

  • 请您更具体地说明您想要在这里实现的目标。您是否更改了用户表中的密码列名称?
  • 是的,我已将密码列名称更改为 sha1_pass 并有一个自定义哈希器。我要做的是覆盖 EloquentUserProvider 类中的 validateCredentials() 方法,因为它的密码列名称硬编码为 $credentials['password'];并使用 Sha1 Hasher 进行检查。
  • 密码列在 Laravel 身份验证系统中没有硬编码。您可以告诉 Auth 系统使用指定的列作为密码列
  • 我已经在 Users.php 模型中完成了这项工作,您可以在其中覆盖 Authenticatable 类的 getAuthPassword 方法并将 $this->password 变量更改为列的名称。现在,除非我遗漏了什么,否则在登录之前最后调用 EloquentUserProvider/DatabaseUserProvider 类中的 validateCredentials() ,它具有硬编码的“密码”字段并使用纯文本验证散列密码。
  • 我想说的是,当你能做到这一点时,为什么还要承受这种压力:if(Auth::attempt(['new_password_column' => $password, 'new_username_column'=>$username])) { //login success }

标签: php laravel laravel-5 laravel-5.2


【解决方案1】:

您是如何“覆盖”EloquentUserProvider 的实例的?因为 Laravel 正在根据您设置的 auth.driver 创建 Auth 实例。

检查Illuminate/Auth/CreatesUserProviders@createUserProvider,它是硬编码的,基于驱动程序,以加载EloquentUserProvider。你可以试试bind你的实例到Illuminate\Auth\EloquentUserProvider

您得到的错误意味着您的__construct 没有得到正确的输入。根据您的代码的外观,它基本上是这样做的:

new AuthUserProvider($app);

但它应该怎么做:

return new EloquentUserProvider($this->app['hash'], $config['model']);

如果它不起作用,请尝试通过 AuthManager 类注册自定义提供程序。请参阅Illuminate\Auth\AuthManager@provider line +- 266。

也许吧!未测试:

auth()->provider(AuthUserProvider::class);

【讨论】:

  • 谢谢。这帮助很大!
  • 但它回答了你的问题吗?
  • 嗯,有点,它让我更深入地挖掘并了解更多,所以谢谢。
猜你喜欢
  • 2017-10-19
  • 1970-01-01
  • 2022-01-16
  • 2018-08-04
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2012-02-06
相关资源
最近更新 更多