You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel8使用jasny/sso报Unresolvable dependency依赖解析错误

根本原因

该报错和路由缓存、自动加载、项目优化缓存无任何关联,核心问题是Laravel服务容器无法自动解析callable类型的依赖参数:

  • Laravel依赖注入机制仅支持自动解析类型提示为具体类、接口的依赖,对于callable、string、array这类非类/接口的伪类型、标量类型参数,容器无法自动推断需要传入的具体值,因此直接抛出解析异常。
  • 你使用的jasny/sso包中Server类构造函数的第一个参数$getBrokerInfo是要求业务方自定义实现的回调:作用是根据传入的broker ID返回对应broker的密钥、允许域名列表信息,这类业务逻辑包本身不可能提供默认实现,你没有在服务容器中为Server类编写显式绑定规则,容器自然无法完成实例化。
解决方法

你只需要在Laravel的服务提供者中补充对应绑定规则即可,步骤如下:

  • 打开app/Providers/AppServiceProvider.php文件,在register()方法中添加Jasny\SSO\Server\CacheInterface接口的绑定(如果你已经做过该绑定可以跳过):
use Jasny\SSO\Server\CacheInterface;
use Jasny\SSO\Server\Cache\Psr16Cache;
use Illuminate\Contracts\Cache\Repository as LaravelCache;

$this->app->bind(CacheInterface::class, function ($app) {
    // 基于Laravel原生缓存实现SSO包需要的缓存接口
    return new Psr16Cache($app->make(LaravelCache::class));
});
  • 在同个register()方法中继续添加Jasny\SSO\Server\Server类的绑定,手动传入构造函数需要的回调参数:
use Jasny\SSO\Server\Server;
use App\Models\SsoBroker; // 替换为你项目中存储SSO broker信息的模型

$this->app->bind(Server::class, function ($app) {
    $cache = $app->make(CacheInterface::class);
    
    // 实现$getBrokerInfo回调,逻辑根据你的业务调整
    $getBrokerInfo = function (string $brokerId) {
        $broker = SsoBroker::query()->where('broker_id', $brokerId)->first();
        return $broker ? [
            'secret' => $broker->secret,
            'domains' => array_map('trim', explode(',', $broker->allowed_domains))
        ] : null;
    };

    return new Server($getBrokerInfo, $cache);
});
  • 绑定完成后执行php artisan optimize:clear清理容器缓存即可生效。

注意:回调返回的数组必须包含secret(字符串类型)和domains(数组类型,存该broker允许的回调域名)两个键,否则SSO校验流程会出错。

内容的提问来源于stack exchange,提问作者Mostafa Lotfi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:24:26