You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel双数据库Token验证中间件创建求助

解决多数据库Sanctum认证中间件问题

针对你用Laravel Sanctum处理多数据库认证的需求,以下是具体实现步骤:

1. 创建自定义认证中间件

首先生成一个专门用于第二个数据库认证的中间件:

php artisan make:middleware AuthenticateSecondDatabase

2. 编写中间件逻辑

打开生成的app/Http/Middleware/AuthenticateSecondDatabase.php,替换为以下代码,注意替换成你的实际模型和数据库连接名:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Laravel\Sanctum\Guard;

class AuthenticateSecondDatabase
{
    public function handle(Request $request, Closure $next)
    {
        // 初始化Sanctum Guard,指定第二个数据库的用户模型和连接
        $guard = new Guard(Auth::createUserProvider('eloquent', [
            'model' => \App\Models\SecondUser::class, // 你的第二个用户模型
            'connection' => 'second_database', // 对应config/database.php里的连接配置名
        ]));

        // 验证令牌并获取用户
        if (!$user = $guard->user($request)) {
            return response()->json(['message' => 'Unauthorized'], 401);
        }

        // 将认证用户设置到当前请求的Auth实例中
        Auth::setUser($user);

        return $next($request);
    }
}

3. 注册中间件

打开app/Http/Kernel.php,在$routeMiddleware数组中添加中间件别名:

protected $routeMiddleware = [
    // ... 其他原有中间件
    'auth.second' => \App\Http\Middleware\AuthenticateSecondDatabase::class,
];

4. 配置第二个用户模型

确保你的第二个用户模型(比如SecondUser)正确使用Sanctum的Trait并指定数据库连接:

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Sanctum\HasApiTokens;

class SecondUser extends Authenticatable
{
    use HasApiTokens;

    // 指定该模型使用的数据库连接
    protected $connection = 'second_database';

    // 根据需求设置可填充字段
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    // 其他模型逻辑...
}

5. 配置数据库连接

在config/database.php的connections数组中添加第二个数据库的配置:

'connections' => [
    // 默认数据库连接
    'mysql' => [
        // ... 原有配置
    ],

    'second_database' => [
        'driver' => 'mysql',
        'host' => env('DB_SECOND_HOST', '127.0.0.1'),
        'port' => env('DB_SECOND_PORT', '3306'),
        'database' => env('DB_SECOND_DATABASE', 'forge'),
        'username' => env('DB_SECOND_USERNAME', 'forge'),
        'password' => env('DB_SECOND_PASSWORD', ''),
        'unix_socket' => env('DB_SECOND_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => null,
    ],
],

6. 在路由中使用中间件

现在你可以在需要第二个数据库认证的路由组中使用auth.second中间件:

use Illuminate\Http\Request;

Route::middleware('auth.second')->group(function () {
    Route::get('/second-user/profile', function (Request $request) {
        // 获取当前认证的第二个数据库用户
        return $request->user();
    });
});

内容的提问来源于stack exchange,提问作者Santi Phannolath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 00:21:26