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
相关产品推荐
相关产品推荐

