阿里云控制台配置
1. 创建用户
2. 创建角色
3. 创建权限策略
此为权限策略的脚本,表示对your-Bucket-name有读写权限,修改your-Bucket-name成你的Bucket。
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:DeleteObject",
"oss:ListParts",
"oss:AbortMultipartUpload",
"oss:PutObject"
],
"Resource": [
"acs:oss:*:*:your-Bucket-name",
"acs:oss:*:*:your-Bucket-name/*"
]
}]
}
4. 将权限策略赋予角色。
5. 临时授权访问权限
上面的步骤中,我们创建了用户、角色、访问权限,至此应该很容易理解,那就是角色拥有权限,用户在扮演某个角色。但是如果在用户扮演角色的时候不进行控制,那么一个用户就可以扮演任何角色了,这显然是不可以的,临时授权访问实际就是控制用户可以扮演哪些角色。每个角色都有一个ARN值,这个需要我们先记录下来,将来会用到。
然后新建策略,在Resource处填写刚才得到的ARN。
脚本内容
{
"Statement": [{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Resource": "acs:ram::1894xxxxxx722283:role/ramtestappreadonly"
}],
"Version": "1"
}
这一步的意思是,新建了一个权限,这个权限的内容就是可以扮演acs?:1894xxxxxx722283:role/ramtestappreadonly这个角色。
6.用户配置
在权限管理中,将第5步创建的临时授权访问权限赋予用户,这就意味着,该用户可以扮演这个角色了。
注意:我们好像只允许了用户可以扮演某个角色的权限,但是并没有设置具体的扮演哪个角色,这一步将在服务端代码中进行设置。
**
PHP服务端使用STS授权访问
**
require_once('aliyun-php-sdk-core/Config.php');
require_once('aliyun-oss-php-sdk-master/autoload.php');
use Sts\Request\V20150401 as Sts;
use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Http\RequestCore;
use OSS\Http\ResponseCore;
$endpoint = "<在oss控制台中选择某Bucket后查看>";
$STSaccessKeyID = "<在第6步用户配置中创建并记录>";
$STSaccessKeySecret = "<在第6步用户配置中创建并记录>";
$STSroleArn = "<在第5步临时授权访问中查看>";
$bucket = "<你的bucket名称>";
$OSSfilename = "<上传到OSS的路径+文件名>";
$tokenExpire = 900;//过期时间 单位s 最小900 最大3600
//Policy的意义是仅允许用户操作bucket上传指定的文件,
//例如:我用userid当做用户头像的文件名称,当userid=1001的用户上传头像时,
//$OSSfilename = "usericon/1001.jpg",就相当于对该用户开放了写权限。
$policy = '{
"Statement": [
{
"Action": [
"oss:PutObject",
"oss:ListParts"
],
"Effect": "Allow",
"Resource": [
"acs:oss:*:*:'.$bucket.'/'.$OSSfilename.'"
]
}
],
"Version": "1"
}';
$iClientProfile = DefaultProfile::getProfile("cn-hangzhou", $STSaccessKeyID, $STSaccessKeySecret);
$client = new DefaultAcsClient($iClientProfile);
$request = new Sts\AssumeRoleRequest();
$request->setRoleSessionName("aaa");
$request->setRoleArn($STSroleArn); /** 这里才真正的让用户扮演了角色。**/
$request->setPolicy($policy); /** 进一步设置用户此次请求的操作权限。**/
$request->setDurationSeconds($tokenExpire);
$response = $client->doAction($request);
$body = $response->getBody();
$content = json_decode($body);//STS临时授权凭证
//我自己封装返回结果;
$res = array();
$res['status'] = 0;
if ($response->getStatus() == 200)
{
$res['status'] = 200;
$res['Endpoint'] = $endpoint;
$res['AccessKeyId'] = $content->Credentials->AccessKeyId;
$res['AccessKeySecret'] = $content->Credentials->AccessKeySecret;
$res['SecurityToken'] = $content->Credentials->SecurityToken;
$res['BucketName'] = $bucket;
$res['FileName'] = $OSSfilename;
}
echo json_encode($res);
$res的内容,客户端使用这些参数进行文件操作。
{
"status":200,
"Endpoint":"http://oss-cn-hangzhou.aliyuncs.com",
"AccessKeyId":"STS.NKGc1ADSgECCSYYqM5HDhUiMr",
"AccessKeySecret":"CihpVTTtzQeGCeVJjHwYtKPq6MLHXQuo81xKHMBcsQ4F",
"SecurityToken":"CAISvAJ1q6Ft5B2yfSjIr4jyKIv1qYxG8oGoUX/olU1gRMtEuqzmkDz2IHhNe3VuA+0WtvowmW5Q5vkelqphWoMdsJRrrDo1vPpt6gqET9frX6XXhOV2ZvTHdEGXDxnkppGwB8zyUNLafNq0dlnAjVUd6LDmdDKkLSrHVJqSksxfc8gwVAu1ZiYkYdBNPVlGqdQGDXLLKe3XH3yMuGfLC1dysQdRkH527b/FoveR8R3Dllb3uK536I36OcqjdNI+fsU9AcWkwKlzf7bB3StZ9xlB7+BRt5dzwgv8+NOFDHspukzXaraPqoA+clAgPvBjSpQp9qasyadK3cXIjJnyxhp3OuVYbj/SXojIwrGfQLr2aohjKOajZSuQjIjfacXvzBkjZX9eMQpWe9ckI2NxAgdpVyneLaar6Ls//YRT0E7vGoABAMhh7Kf5NN5S2Kl+Qm4BbBquIprfqOsKGvfLV4wCc4D+3lU4OQaQkPFAaGG5QpSRSU5g1qe8CIAAXMY9a5s6Cf0KqbzJRjdk3d1jJyGu/Tukszarxf6OVYAZjR0NuafdkkTJ+e6civmb7T0d7Pn1iNf5BvBnRAoINb2VSEjiIbU=",
"BucketName":"XXXXXXXXX",
"FileName":"XXXXXXX.jpg"
}
客户端C#测试
//发起HTTP-GET请求;
static string HttpGet(string url)
{
string result = string.Empty;
try
{
HttpWebRequest wbRequest = (HttpWebRequest)WebRequest.Create(url);
wbRequest.Method = "GET";
HttpWebResponse wbResponse = (HttpWebResponse)wbRequest.GetResponse();
using (Stream responseStream = wbResponse.GetResponseStream())
{
using (StreamReader sReader = new StreamReader(responseStream))
{
result = sReader.ReadToEnd();
}
}
}
catch (Exception)
{
return null;
}
return result;
}
static void Main(string[] args)
{
//请求服务器获取STS参数;
string res = HttpGet("http://127.0.0.1/public/STS_Test.php");
JSONNode json = JSON.Parse(res); //JSON对象来源于SimpleJSON库,百度下载;
//初始化OSS;
OssClient ossStsClient = new OssClient(json["Endpoint"], json["AccessKeyId"], json["AccessKeySecret"], json["SecurityToken"]);
//本地文件路径;
string localFile = "D://testImage.jpg";
try
{
//上传文件;
ossStsClient.PutObject(json["BucketName"], json["FileName"], localFile);
Console.WriteLine("Put object succeeded");
}
catch (Exception ex)
{
Console.WriteLine("Put object failed, {0}", ex.Message);
}
Console.ReadKey();
}
从客户端代码可以看出,前端不用保存任何OSS的参数,每次发起请求都会生成新的AccessKeyId和AccessKeySecret,并且可以限制客户端只能修改指定文件,安全性得到了提高。
你可以尝试修改json[“FileName”]的值,看看是否能够修改其他文件。