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
相关产品推荐
相关产品推荐

