我创建了一个带有服装字段名称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 )
保存前密码为哈希值。
因为您更改了密码字段的名称,所以您需要创建自定义用户提供程序并在配置文件中注册它。
正如你在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
],
],
我希望这能帮到您。
传递给attempt
的数组只是一个数组;它与您的数据库表无关。你不必使用'fld_Username'
和'fld_Password'
。而只是使用$user['username']
和$user['password']
。
Laravel正在寻找“密码”这个词作为您传递的数组中的密钥,以查看哪个是密码。
(Qazxswpoi)
只需覆盖Proof中的username
函数并返回您的用户名字段,如下所示:
LoginController
除了正确执行的class LoginController extends Controller
{
.
.
.
public function username()
{
return "fld_Username";
}
}
方法之外,无需更改任何其他内容。
我希望这能帮到您。