Laravel Passport:使用自定义密码

时间:2018-05-07 16:07:58

标签: php laravel laravel-passport

我想使用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);
    }
}

此控制器的请求参数为loginpassword

问题是当我转到与此控制器关联的路线时,我们说POST /api/login。我收到这个错误:

  

ErrorException:未定义的索引:文件中的密码...第133行的EloquentUserProvider.php

     

[堆栈跟踪的第一行......]

     
      
  1. ... PassportController.php:21
  2.   

我的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

感谢您的帮助。

1 个答案:

答案 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,无论你的密码字段是什么名字。你最重要的是。

在授权类型的上下文中,“密码”这个词顺便说一句是完全不同的东西,而不是你应该改变的东西。这更多地与配置引用有关,而不是数据库字段。