Laravel LdapRecord认证时查询数据库而非Active Directory如何解决?
问题原因
你配置的web认证守卫默认仍绑定Eloquent本地用户提供者,没有切换为你新增的ldap提供者,所以认证流程始终查询本地users表,触发字段不存在错误。
修复步骤
- 第一步:修改
config/auth.php中的守卫配置,将web守卫的provider参数值从users改为ldap
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'ldap', // 此处替换原有值users ], ],
- 第二步:调整
LoginController的credentials方法的字段键名,你配置的AD属性到本地字段的映射规则为mail同步到email,所以凭证匹配键改为email即可,LdapRecord会自动关联AD的mail属性查询
protected function credentials(Request $request) { return [ 'email' => $request->email, 'password' => $request->password, ]; }
- 第三步:确认你的
App\Models\User类已经实现LdapRecord\Laravel\Auth\LdapAuthenticatable接口并引入LdapRecord\Laravel\Auth\AuthenticatesWithLdaptrait,示例如下:
use LdapRecord\Laravel\Auth\AuthenticatesWithLdap; use LdapRecord\Laravel\Auth\LdapAuthenticatable; class User extends Authenticatable implements LdapAuthenticatable { use AuthenticatesWithLdap; // 原有模型代码 }
- 第四步:执行命令清空配置缓存,确保修改后的配置生效
php artisan config:clear
可选补充配置
如果你需要保留AD不可用时fallback到本地用户认证的能力,可在config/auth.php的ldap提供者配置中新增fallback参数:
'ldap' => [ 'driver' => 'ldap', 'model' => LdapRecord\Models\ActiveDirectory\User::class, 'database' => [ 'model' => App\Models\User::class, 'sync_passwords' => false, 'sync_attributes' => [ 'name' => 'cn', 'email' => 'mail', 'username' => 'samaccountname', ], 'fallback' => true, // 新增该行 ], ],
内容的提问来源于stack exchange,提问作者user1693014
相关产品推荐
相关产品推荐

