使用directorytree/ldaprecord-laravel连接AD认证时遇类型错误
解决LdapRecord-Laravel AD认证的类型错误
问题场景
使用directorytree/ldaprecord-laravel包在Laravel中做AD用户认证,执行以下代码时触发类型错误:
$connection = Container::getConnection('default'); $user = User::findByOrFail('samaccountname', 'sbauman'); if ($connection->auth()->attempt($user->getDn(), 'SuperSecret')) { // Credentials are valid! }
错误信息:
message: "LdapRecord\Laravel\LdapUserRepository::createModel(): Return value must be of type LdapRecord\Models\Model, App\Models\User returned"
解决方案
错误核心是混淆了本地Laravel用户模型和LdapRecord的AD用户模型,按以下步骤修复:
修正命名空间引用
在代码顶部引入正确的LdapRecord AD用户模型:use LdapRecord\Models\ActiveDirectory\User; use LdapRecord\Container;如果需要同时使用本地
App\Models\User,可以给Ldap模型起别名避免冲突:use LdapRecord\Models\ActiveDirectory\User as LdapUser; use LdapRecord\Container;然后代码中替换为:
$user = LdapUser::findByOrFail('samaccountname', 'sbauman');检查LDAP配置文件
打开config/ldap.php,确认models配置下的user项指向LdapRecord的模型类,而非本地用户模型:'models' => [ 'user' => LdapRecord\Models\ActiveDirectory\User::class, ],
原因说明
LdapRecord的LdapUserRepository要求创建的模型必须是LdapRecord\Models\Model的实例,但你的代码中调用的是本地App\Models\User(继承自Laravel默认的Authenticatable),两者类型不兼容,因此触发类型错误。
内容的提问来源于stack exchange,提问作者AntonyMN
相关产品推荐
相关产品推荐

