编者按
阿里云oss创建用户用来生成预签名 URL 读取图片 阿里云oss图片防盗链,用户创建,权限策略添加,php生成url签名并设置有效期。
完整流程:新建 RAM 用户,专门用于 caisiyou 这个 Bucket(支持上传 + 生成预签名 URL 读取图片)
访问控制 RAM 控制台地址:https://ram.console.aliyun.com/
第 1 步:新建 RAM 用户
左侧菜单:身份管理 → 用户
右上角点 创建用户
填写:
登录名称:oss_caisiyou(随便起名,英文下划线,推荐这个)
显示名称:oss_caisiyou
✅ 访问方式:勾选【OpenAPI 调用访问】(最重要!不要勾选控制台密码登录)
其他不用填,点确定
创建成功页面,立刻复制保存 AccessKeyId 和 AccessKeySecret
⚠️ 只弹出这一次!关闭页面后 Secret 就看不到了,丢了只能重新创建 AK
第 2 步:新建自定义权限策略(只授权 caisiyou bucket)
左侧菜单:权限管理 → 权限策略
右上角 创建权限策略
策略名称:policy_caisiyou_oss
描述:caisiyou bucket oss读写,含GetObject生成签名url
选择【脚本编辑】,把下面 JSON 全部粘贴进去
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:PutObject",
"oss:InitiateMultipartUpload",
"oss:UploadPart",
"oss:CompleteMultipartUpload",
"oss:ListParts",
"oss:AbortMultipartUpload",
"oss:GetObject"
],
"Resource": [
"acs:oss:*:*:caisiyou",
"acs:oss:*:*:caisiyou/*"
]
}
]
点击【确定】保存策略
权限说明:
oss:GetObject:生成预签名 URL 预览 / 下载文件必备
其余 action:分片上传、普通 Put 上传(你项目直传用)
资源限定死 caisiyou,不会访问到别的 Bucket,最小权限,安全
第 3 步:把策略授权给刚才新建的 RAM 用户
回到【身份管理 → 用户】,找到用户 oss_caisiyou,点添加权限
权限类型:自定义策略
在搜索框搜索 policy_caisiyou_oss,勾选这条策略
点确定授权
第 4 步:等待生效 + PHP 替换 AK
⏱️ RAM 策略1~3 分钟异步生效,保存权限后不要立刻测试,等一会。
修改你的 OssHelper 原生代码,填入新 AK
<?php
class OssHelper
{
private static $accessKeyId = "LTAI5t7oGLAn9R2222222";
private static $accessKeySecret = "vpyGCSVjerznYqSFx22222222";
private static $endpoint = "caisiyou.oss-cn-beijing.aliyuncs.com"; // 自定义域名 / oss-cn-xxx.aliyuncs.com
private static $bucket = "caisiyou";
/**
* 原生PHP 生成OSS GET预签名URL(无SDK)
* @param string $object OSS文件路径,例:upload/1.jpg
* @param int $expire 有效期秒数,最大32400
* @return string|null
*/
public static function getSignedUrl(string $object, int $expire = 1800): ?string
{
$accessKeyId = self::$accessKeyId;
$accessKeySecret = self::$accessKeySecret;
$endpoint = self::$endpoint;
$bucket = self::$bucket;
$expire = min($expire, 32400);
$expireTime = time() + $expire;
// 对object进行url编码(注意OSS编码规则:/ 不要编码)
$objectRaw = $object;
$object = rawurlencode($object);
$object = str_replace('%2F', '/', $object);
// 构造签名串(OSS标准CanonicalString)
$stringToSign = "GET\n\n\n{$expireTime}\n/{$bucket}/{$objectRaw}";
// HMAC-SHA1签名,base64编码
$signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret, true));
$signature = rawurlencode($signature);
// 拼接URL
$url = "https://{$endpoint}/{$object}";
$url .= "?OSSAccessKeyId={$accessKeyId}";
$url .= "&Expires={$expireTime}";
$url .= "&Signature={$signature}";
return $url;
}
}
// 使用示例
echo $imgsrc = OssHelper::getSignedUrl("2c66ec0fa1f65498fbf0b8bf23858a13.jpeg", 600);
?>
<img src='<?php echo $imgsrc;?>'>