【问题标题】:How to change the default table/model (User) for JWT authentication in Laravel and Dontrine?如何更改 Laravel 和 Dontrine 中 JWT 身份验证的默认表/模型(用户)?
【发布时间】:2017-10-19 12:38:34
【问题描述】:

我正在开发一个基于Laravel 5.4.24 并与Symfony 组件和Doctrine 集成的项目。我需要根据 site_staffs(SiteStaff model) 的请求对员工进行身份验证并返回令牌。 site_staffs 表包含以下列:(id,site_id, code, number,..)SiteStaff entity (id,site, code,..) 中的某些列具有不同的名称。 users 还有另一个表,我对用户进行身份验证并返回令牌没有问题。 (就我而言,我不需要对用户进行身份验证,我只是为了测试而这样做)。 问题是当我尝试更改 JWT 的默认设置以验证来自 site_staffs 表中的员工时,如下所示,我收到一条错误消息(请参阅页面下方):

配置/jwt.php:

//'user' => 'App\User',
'user' => 'App\Entities\SiteStaff',

配置/auth.php:

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
     ],

    'api_token' => [
       'driver' => 'api_token',
       'provider' => 'users',
     ],

    //'api' => [
        //'driver' => 'jwt',
        //'provider' => 'users',
    //],        
   ],

    'providers' => [
        'users' => [
            'driver' => 'doctrine',
             //'model' => App\Entities\User::class,
            'model' => App\Entities\SiteStaff::class,            
        ],

pi/SiteStaffController:

我将凭据传递给 JWT,如下所示:

$credentials = 
    [
        'site'     =>  $bpId,
        'code'  =>  $lanyard_code
    ];   

if(! $token = JWTAuth::attempt($credentials)){
      return response()->json(['error' => ['messages' => 
      ['Invalid credentials'] ]
   ], IlluminateResponse::HTTP_UNAUTHORIZED);
 }else{
    dd($token);
 }   

这是我得到的错误:

Type error: Argument 1 passed to 

Tymon\JWTAuth\Providers\User\EloquentUserAdapter::__construct() must be an 
instance of Illuminate\Database\Eloquent\Model, instance of 
App\Entities\SiteStaff given, called in /vagrant/vendor/tymon/jwt-
auth/src/Providers/JWTAuthServiceProvider.php on line 126

我尝试了许多不同的方法和解决方案,但没有一个对我有用。如果你能让我知道什么是错的,我错过了什么,我将不胜感激? 非常感谢您的帮助。

【问题讨论】:

    标签: php laravel symfony doctrine-orm


    【解决方案1】:

    根据在 laravel 中为 jwt auth 更改用户表名的要求,需要遵循我尝试过的两步更改。

    我已通过以下步骤成功地将登录/身份验证表从用户更改为客户。

    第 1 步:更改以下提供者的详细信息

    config/auth.php

    'providers' => [
        // 'users' => [
        //     'driver' => 'eloquent',
        //     'model' => App\User::class,
        // ],
         'users' => [
             'driver' => 'database',
             'table' => 'customer',
         ],
    ],
    

    第二步:修改 jwt 文件

    config/jwt.php

    // here to give a model path for authentication
    'user' => 'App\Models\Customer',
    

    参考:change users table name for jwt auth in laravel

    【讨论】:

    • jwt.php 文件在哪里,我在 php lumen 框架中找不到它
    • @Saddan jwt.php文件在config目录下生成
    【解决方案2】:

    在我的场景中,我有两个守卫,web 和 api:

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    
        'api' => [
            'driver' => 'jwt',
            'provider' => 'managers',
            'hash' => false,
        ]
    ],
    

    所以,我遵循 Tymon 的 Jwt 库文档中描述的这些步骤:

    "如果新创建的 'api' 守卫没有设置为默认守卫,或者您定义了多个守卫来处理身份验证,则应在调用 auth() 时指定守卫。"

    $token = auth('api')->attempt($credentials);
    

    在我的自定义 api 身份验证控制器中,我实现了如下登录方法并且它可以工作:

    public function login(Request $request)
    {
        $this->validateLogin($request);
        
        $credentials = $this->credentials($request);
        
        $token = auth('api')->attempt($credentials);
    
        return $token
            ? ['token' => $token]
            : response()->json(['error' => \Lang::get('auth.failed')], 401);
    }
    

    如果这个答案对你有用,请点个赞=)。

    【讨论】:

      猜你喜欢
      • 2017-10-23
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多