Laravel9 Azure Blob SAS读文件报AuthorizationPermissionMismatch
问题根因
报错核心原因是当前使用的SAS Token权限不足:
- 你生成的SAS Token仅配置了
Read(读)权限,这个权限只支持直接读取已知完整路径的单个Blob文件,和你测试“直接拼接SAS访问单个文件URL可以正常打开”的现象完全匹配。 - 测试代码里调用的
$disk->files($path)是列出容器下Blob文件列表的操作,这个操作需要SAS Token额外具备List(列表)权限,没有该权限就会抛出AuthorizationPermissionMismatch错误。 - 移除SAS Token配置后,扩展包会默认使用存储账户的访问密钥走账户级鉴权,具备容器的全部操作权限,所以可以正常读取文件列表。
另外配置文件里重复写了两行'driver' => 'azure'属于冗余配置,虽然不触发报错,但建议清理。
解决步骤
- 重新生成容器级SAS Token:在存储账户的容器共享访问签名配置页,除了已勾选的读取权限,额外勾选**列表(List)**权限;如果后续需要通过该磁盘做文件上传、删除操作,还要对应勾选写入、删除等所需权限,确认SAS的生效时间、过期时间、允许访问的网络范围配置正确后生成新的Token。
- 修正Laravel侧配置:
- 删掉配置中重复的
'driver' => 'azure'行 - 检查填入环境变量的SAS Token值,不要携带URL参数前缀的
?符号(如果复制出来的SAS串开头是?sp=r&...,要把开头的?删掉,只保留后面的参数内容)
最终正确的磁盘配置参考:
- 删掉配置中重复的
'azure' => [ 'driver' => 'azure', 'sasToken' => env('AZURE_STORAGE_SAS_TOKEN'), 'container' => env('AZURE_STORAGE_CONTAINER'), 'url' => env('AZURE_STORAGE_URL'), 'prefix' => null, 'endpoint' => env('AZURE_STORAGE_ENDPOINT'), 'retry' => [ 'tries' => 3, 'interval' => 500, 'increase' => 'exponential' ], ],
- 清除配置缓存后验证:执行Artisan命令
php artisan config:clear清空Laravel的配置缓存,再访问测试路由即可正常获取文件列表。
补充提示:如果业务场景不需要遍历、列出容器内的文件,只需要读取已知完整路径的单个文件,保留现有仅带Read权限的SAS也可以正常使用
$disk->get('文件完整路径')方法读取文件,不需要额外加List权限。
内容的提问来源于stack exchange,提问作者Sinay
相关产品推荐
相关产品推荐

