首页 > 解决方案 > Laravel Passport:使用自定义密码

问题描述

我想使用user_password而不是仅password用于我的 API 数据库的密码列的名称。所以这是login()在 my 中检索令牌的方法的代码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:未定义的索引:文件中的密码... EloquentUserProvider.php 位于第 133 行

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

  1. ... PassportController.php:21

我的 PassportController 中的第 21 行是我在上面发布的登录功能的第二行,实际上,password我写的凭据中没有通知该字段:我写user_password而不是password,但字符串password在 EloquentUserProvider.php 中硬编码,第 133 行:

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在我的数据库中而不是password

谢谢您的帮助。

标签: phplaravellaravel-passport

解决方案


这个问题实际上并不是 Passport 特有的,它更多地与从 Passport 抽象出来的 Auth Guard 行为有关。只需将其添加到您的用户模型中:

/**
 * Get the password for the user.
 *
 * @return string
 */
public function getAuthPassword()
{
    return $this->user_password;
}

Laravel 开箱即用的App\User模型 extends Illuminate\Foundation\Auth\User,它使用了Illuminate\Auth\Authenticatabletrait。该特征只是满足Illuminate\Contracts\Auth\Authenticatable接口条件的一种便利,其中之一是基本上为您的密码字段命名的任何获取器。你会覆盖这个。

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


推荐阅读