我创建了一个带有服装字段名称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 )
保存前和密码已经过哈希。
答案 0 :(得分:1)
由于您更改了密码字段的名称,因此需要创建一个自定义用户提供程序并将其注册在配置文件中。
正如您在vendor\laravel\framework\src\Illuminate\Auth\EloquentUserProvider.php
第138行中看到的那样,密码字段是硬编码的,没有其他更改方法。
因此在某处放置一个类的应用程序文件夹是这样的:
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
],
],
我希望这会对您有所帮助。
答案 1 :(得分:0)
传递给attempt
的数组只是一个数组;它与您的数据库表无关。您不必使用'fld_Username'
和'fld_Password'
。而只需使用$user['username']
和$user['password']
Laravel正在寻找“密码”这个词作为你传递的数组中的密钥,看看哪个是密码。
(Proof)
答案 2 :(得分:0)
只需重写username
中的LoginController
函数,然后返回您的用户名字段,就像这样:
class LoginController extends Controller
{
.
.
.
public function username()
{
return "fld_Username";
}
}
除了您刚才正确执行的getAuthPassword
方法外,无需更改其他任何内容。
我希望这会对您有所帮助。