Laravel 8集成Ldaprecord认证后Auth中间件会话识别失败
Laravel 8 LDAP认证会话失效问题排查与解决
核心问题:Guard配置与登录模型不匹配
你的auth.php里,web Guard指定使用ldap Provider,对应模型是App\Models\LdapUser,但在登录逻辑中,你创建并登录的是本地User模型实例:
$user = User::firstOrCreate(['username' => $request->username], [ 'is_admin' => 0, 'is_active' => 1 ]); Auth::login($user);
当请求进入中间件时,Laravel会用ldap Provider去会话中查找用户,但LdapUser模型无法匹配本地User的ID,因此返回Auth::check() = false。
解决办法二选一:
- 调整Guard使用本地用户Provider
修改config/auth.php:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', // 将provider从ldap改为users ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'ldap' => [ 'driver' => 'ldap', 'model' => App\Models\LdapUser::class, ], ],
这样Session Guard会用本地User模型加载会话用户,和你登录的模型完全一致。
- 使用LdapRecord同步登录LDAP模型
按照LdapRecord文档配置Eloquent同步,直接登录LdapUser模型,确保Guard的Provider和登录模型对应。
其他排查点
1. 暂时禁用AuthenticateSession中间件
你的web中间件组里启用了AuthenticateSession,这个中间件会校验会话用户的一致性,如果LDAP和本地用户数据不同步,可能触发认证失效。先注释掉:
// \Illuminate\Session\Middleware\AuthenticateSession::class,
测试是否能正常认证,排除这个中间件的干扰。
2. 检查Session环境配置
确认.env里的Session相关参数:
SESSION_DOMAIN:本地开发留空或设为localhost,生产环境填写对应域名SESSION_SECURE:本地开发设为false,HTTPS环境设为trueSESSION_SAME_SITE:建议设为lax,避免跨域Cookie问题
3. 清除缓存与旧会话
执行命令清理配置缓存和过期会话:
php artisan config:clear php artisan cache:clear rm -rf storage/framework/sessions/*
4. 确认用户模型主键一致性
确保User和LdapUser模型的主键字段一致(默认是id),如果LdapUser使用的是LDAP的唯一标识(比如objectguid),要同步到本地User模型的对应字段,否则会话加载用户时会找不到匹配项。
内容的提问来源于stack exchange,提问作者Taha
相关产品推荐
相关产品推荐

