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

Laravel 6使用Sentinel时如何从内嵌iframe中读取session用户权限信息

Laravel 6 iframe读取Session可行方案

根因说明

你遇到的问题本质是/public目录下的第三方代码没有经过Laravel的请求生命周期,不会自动初始化Laravel Session,也无法直接读取Sentinel封装的会话数据。以下是3种优先级从高到低的可行方案:

方案1:Laravel路由代理iframe请求(最推荐)

无需修改第三方代码的核心逻辑,安全性和兼容性最优:

  • 把第三方代码从/public目录迁移到项目根目录下的自定义目录,比如/third-party,避免公网直接访问
  • 在routes/web.php中新增代理路由,绑定web中间件(自动初始化Session、处理用户鉴权):
Route::get('/third-party/{path?}', function ($path = 'index.php') {
    // 提前获取Sentinel用户权限,注入全局变量供第三方代码直接读取
    $GLOBALS['laravel_user_permissions'] = Sentinel::check() ? Sentinel::getUser()->permissions : [];

    // 路径安全校验,防止目录穿越攻击
    $fullPath = realpath(base_path('third-party/' . $path));
    if (!$fullPath || strpos($fullPath, base_path('third-party')) !== 0) {
        abort(404);
    }

    // 执行第三方代码
    require $fullPath;
})->where('path', '.*')->middleware('web');
  • iframe的src属性直接填写代理路由地址即可,第三方代码内直接读取$GLOBALS['laravel_user_permissions']就能拿到权限数据。

方案2:前端接口调用(适合纯前端第三方代码)

如果第三方代码以静态前端资源为主,可以通过接口跨上下文传递数据:

  • 在routes/web.php中新增权限查询接口:
Route::get('/api/user/current-permissions', function () {
    return response()->json([
        'is_login' => Sentinel::check(),
        'permissions' => Sentinel::check() ? Sentinel::getUser()->permissions : []
    ]);
})->middleware('web');
  • iframe内的前端代码直接调用同站接口即可,请求会自动携带Laravel Session Cookie,无需额外处理:
fetch('/api/user/current-permissions', {
    credentials: 'same-origin'
}).then(res => res.json()).then(userInfo => {
    // 拿到权限后执行业务逻辑
    console.log(userInfo.permissions)
})

方案3:手动解析Session文件(不推荐)

如果必须保留第三方代码在/public目录直接访问的逻辑,可以手动解析Laravel Session,仅作为兜底方案:

  • 从请求Cookie中获取Session ID,对应Cookie名参考config/session.php中的cookie配置项,默认是laravel_session
  • 到Session存储目录(默认storage/framework/sessions)找到对应ID的Session文件
  • 参照Laravel加密逻辑解密文件内容,解析序列化后的数据,提取Sentinel存储的用户标识和权限信息
    该方案需要给第三方代码开放Session目录读权限,存在安全风险,且Laravel版本升级后加密/序列化逻辑变更会直接失效。

跨域场景补充配置

如果后续主站和iframe使用不同二级域名,需要修改config/session.php配置:

  • domain配置为根域名,比如'.yourdomain.com'
  • same_site调整为none,同时开启secure => true(必须使用HTTPS协议)

内容的提问来源于stack exchange,提问作者Simone Conti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 16:09:03