【问题标题】:Laravel 5.2 Multi-Auth with API guard uses wrong table带有 API 保护的 Laravel 5.2 Multi-Auth 使用错误的表
【发布时间】:2016-09-22 10:24:44
【问题描述】:

我正在尝试让多身份验证系统正常工作,用户可以通过普通 Web 门户登录,但单独的实体数据库(例如名为“机器人”)也可以通过 API 保护令牌驱动程序登录.但无论我做什么,我所拥有的设置都不会将我的身份验证保护引导到正确的机器人数据库,而是继续尝试通过令牌将这些请求作为用户进行身份验证(失败,因为用户没有令牌)。

谁能帮我找出哪里出错了?

我首先在 Kernel.php 中组建了一个中间件组:

'api' => [
    'throttle:60,1',
        'auth:api',
],

这使用 config/auth.php 中的设置

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

        'api' => [
            'driver' => 'token',
            'provider' => 'robots',
        ],
    ],

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

    'robots' => [
        'driver' => 'eloquent',
        'model' => App\Models\Robot::class,
    ],
],

在 routes.php 中调用中间件

Route::group(['middleware' => 'api'], function () {
    Route::get('api/request', 'API\RequestController@index');
});

它使用这个模型:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable;

class Robots extends Authenticatable
{
    protected $fillable = [
        'serial_number','api_token',
    ];
    protected $guard = 'Robots';

    protected $hidden = [
        'api_token',
    ];
}

有什么想法吗?

更新:进一步检查,似乎 auth.php 中的大多数设置都没有正确应用 - 有什么方法可以强制这些设置生效吗?

【问题讨论】:

  • 使用网络服务?
  • 什么意思?我没有使用网络中间件,因为这会引发 API 调用的令牌异常。
  • 如果使用 API 则在标头上传递 api_token
  • 对,这就是我想做的。但是,当我在标头中传递 API 令牌时,它会尝试使用用户提供程序而不是机器人提供程序进行身份验证,因为用户在他们的表中没有 API 令牌列。就好像它完全忽略了 config/auth.php 文件一样。
  • 在 App\Models\Robot 表上添加字段 api_token。

标签: php authentication laravel-5.2


【解决方案1】:

在您的 config/auth.php 中,您指定要用于机器人提供者的提供模型:'model' =&gt; App\Models\Robot::class 但是您的机器人类被定义为 class Robots extends Authenticatable,这是类名称不匹配。

将你的班级重命名为class Robot

【讨论】:

  • Authenticatable 是类使用令牌驱动程序所必需的,我认为。另外,为什么扩展语法会改变类的名称?
  • 你的班级名称是 Robots(复数)。将其重命名为 Robot(单数)
  • 我明白了。这是一个很好的问题,但实际上并不是我遇到的问题(见下文)。不过,我会给你赏金奖励,感谢您查看它!
【解决方案2】:

实际问题/解决方案:

Laravel 有一个单独的、很少提及的缓存,专门用于其配置文件。像composer dump-autoload 和php artisan cache:clear 这样的普通缓存和类重置方法不会影响此缓存,这导致我的 auth.php 文件中没有任何设置生效的混乱状态。

清除此缓存的正确方法是使用以下命令:

php artisan config:cache

php artisan config:clear

这些解决了我的问题。

【讨论】:

    猜你喜欢
    • 2016-11-11
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2018-02-17
    • 2016-04-09
    相关资源
    最近更新 更多