Laravel 11集成MongoDB时Admin守卫在中间件失效问题求助
解决Laravel 11中MongoDB Admin守卫在自定义中间件失效的问题
以下是针对你遇到的问题的分步解决方案:
1. 检查Admin模型配置
确保你的Admin模型正确适配MongoDB,因为默认Eloquent模型是为SQL数据库设计的:
<?php namespace App\Models; use Jenssegers\Mongodb\Eloquent\Model; use Illuminate\Foundation\Auth\User as Authenticatable; class Admin extends Authenticatable { protected $connection = 'mongodb'; // 指定MongoDB连接(若配置了单独连接) protected $primaryKey = '_id'; // MongoDB默认主键为_id protected $keyType = 'string'; // _id是字符串类型 public $incrementing = false; // MongoDB主键非自增 // 允许批量赋值的字段 protected $fillable = [ 'name', 'email', 'password', ]; // 隐藏敏感字段 protected $hidden = [ 'password', 'remember_token', ]; }
- 必须继承
Authenticatable以获得Laravel认证所需的方法,同时基于MongoDB的Model类扩展。
2. 确认会话驱动为持久化类型
检查.env文件,确保会话驱动不是临时的array类型:
SESSION_DRIVER=file
- 生产环境建议使用
file、database或其他持久化驱动,array驱动仅适用于测试,无法跨请求保存会话数据。
3. 确保路由包含Web中间件
Web中间件组包含会话启动等必要功能,确保你的Admin路由已加入该组:
Route::prefix('/admin') ->namespace('App\Http\Controllers\Admin') ->middleware('web') // 显式添加Web中间件以确保会话正常启动 ->group(function(){ Route::match(['get','post'],'login',[AdminController::class,'login']); Route::group(['middleware'=>['admin']],function(){ Route::match(['get','post'],'dashboard',[AdminController::class,'dashboard']); }); });
4. 清除缓存与会话
缓存的配置或过期会话可能导致异常,执行以下命令清理:
php artisan cache:clear php artisan config:clear php artisan session:clear
5. 中间件内调试会话数据
在Admin中间件中添加调试代码,检查会话是否保存了Admin登录状态:
public function handle(Request $request, Closure $next): Response { // 调试:查看Admin会话键是否存在 dd($request->session()->get('login_admin_admins')); if(!Auth::guard('admin')->check()) { return redirect('/admin/login'); } return $next($request); }
- 若输出Admin的
_id值:问题出在从MongoDB获取用户数据,需检查模型配置 - 若输出
null:会话未被持久化,需检查会话驱动或中间件顺序
6. 确保密码已正确哈希
MongoDB中的Admin密码必须使用Laravel的Hash::make()方法哈希存储,attempt()方法仅能验证哈希后的密码。
内容的提问来源于stack exchange,提问作者Amit Gupta
相关产品推荐
相关产品推荐

