我想使用user_password
而不仅仅password
作为我的API数据库的密码列名称。以下是我login()
中检索令牌的PassportController
方法的代码:
public function login() {
if (Auth::attempt(['user_login' => request('login'), 'password' => request('user_password')])) {
$user = Auth::user();
$success['token'] = $user->createToken('ToutelaBreizh')->accessToken;
return response()->json(['success' => $success], $this->successStatus);
} else {
return response()->json(['error' => 'Unauthorised.'], 401);
}
}
此控制器的请求参数为login
和password
。
问题是当我转到与此控制器关联的路线时,我们说POST /api/login
。我收到这个错误:
ErrorException:未定义的索引:文件中的密码...第133行的EloquentUserProvider.php
[堆栈跟踪的第一行......]
- ... PassportController.php:21
醇>
我的PassportController中的第21行是我在上面发布的登录函数的第二行,实际上,我写的凭据中没有告知password
字段:我写了user_password
而不是{{ 1}},但字符串password
在EloquentUserProvider.php第133行中进行了硬编码:
password
根据this answer的建议,我尝试覆盖public function validateCredentials(UserContract $user, array $credentials)
{
$plain = $credentials['password'];
return $this->hasher->check($plain, $user->getAuthPassword());
}
模型中的validateForPassportPasswordGrant($password)
,但它没有帮助:
User.php
如何在我的数据库中使用public function validateForPassportPasswordGrant($password)
{
return Hash::check($password, $this->user_password);
}
而不是user_password
?
感谢您的帮助。
答案 0 :(得分:2)
这个问题实际上并不是针对Passport的,它更多地与Auth Guard行为有关,后者是从Passport中抽象出来的。只需将此添加到您的用户模型:
/**
* Get the password for the user.
*
* @return string
*/
public function getAuthPassword()
{
return $this->user_password;
}
Laravel开箱即用的App\User
模型扩展了Illuminate\Foundation\Auth\User
,它使用Illuminate\Auth\Authenticatable
特征。这个特性只是为了满足Illuminate\Contracts\Auth\Authenticatable
接口条件的便利,其中一个接口基本上是一个getter,无论你的密码字段是什么名字。你最重要的是。
在授权类型的上下文中,“密码”这个词顺便说一句是完全不同的东西,而不是你应该改变的东西。这更多地与配置引用有关,而不是数据库字段。