【发布时间】: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