oss 可以通过阿里云 sts (security token service) 进行临时授权访问。阿里云 sts 是为云计算用户提供临时访问令牌的web服务。通过 sts,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。
对于您本地身份系统所管理的用户,比如您的 app 的用户、您的企业本地账号、第三方 app ,将这部分用户称为联盟用户。这些联盟用户可能需要直接访问 oss 资源。此外,还可以是您创建的能访问您的阿里云资源应用程序的用户。
对于这部分联盟用户,通过阿里云 sts 服务为阿里云账号(或 ram 用户)提供短期访问权限管理。您不需要透露云账号(或 ram 用户)的长期密钥(如登录密码、accesskey),只需要生成一个短期访问凭证给联盟用户使用即可。这个凭证的访问权限及有效期限都可以由您自定义。您不需要关心权限撤销问题,访问凭证过期后会自动失效。
通过 sts 生成的凭证包括安全令牌(securitytoken)、临时访问密钥(accesskeyid, accesskeysecret)。使用accesskey 方法与您在使用阿里云账户或 ram 用户 accesskey 发送请求时的方法相同。需要注意的是在每个向 oss 发送的请求中必须携带安全令牌。
使用 sts 授权用户直接访问 oss 的流程如下:
sts 安全令牌、角色管理和使用相关内容详情,请参考 ram 角色管理。调用 sts 服务接口assumerole来获取有效访问凭证即可。
假设有一个名为 ram-test 的 bucket 用于存储用户数据,现将利用用户子账号结合 sts 实现 oss 权限控制访问。
您可以通过 oss sdk 与 sts sdk 的结合使用,实现使用 sts 临时授权访问 oss 实例。
{ "statement": [ { "action": [ "oss:getobject", "oss:putobject", "oss:deleteobject", "oss:listparts", "oss:abortmultipartupload", "oss:listobjects" ], "effect": "allow", "resource": [ "acs:oss:*:*:ram-test/*", "acs:oss:*:*:ram-test" ] } ], "version": "1" }
通过调用 sts sdk 请求 sts 服务获取一个安全令牌。sts sdk 的安装及使用详见sts java sdk安装及使用。
<dependency> <groupid>com.aliyun</groupid> <artifactid>aliyun-java-sdk-sts</artifactid> <version>3.0.0</version> </dependency> <dependency> <groupid>com.aliyun</groupid> <artifactid>aliyun-java-sdk-core</artifactid> <version>3.5.0</version> </dependency>
@responsebody @requestmapping("/sts") public assumeroleresponse.credentials sts(httpservletrequest req) { assumeroleresponse.credentials credentials = null; string endpoint = "sts.cn-beijing.aliyuncs.com"; string accesskeyid = "ltaiz5f---pg8"; string accesskeysecret = "yo7yzqxczjgwcy----8l0ffhapd3gwug"; string rolearn = "acs:ram::184810807023---6:role/ggband"; string rolesessionname = "aliyundmsrol--epolicy"; string policy = "{\n" + " \"statement\": [\n" + " {\n" + " \"action\": [\n" + " \"oss:getobject\",\n" + " \"oss:putobject\",\n" + " \"oss:deleteobject\",\n" + " \"oss:listparts\",\n" + " \"oss:abortmultipartupload\",\n" + " \"oss:listobjects\"\n" + " ],\n" + " \"effect\": \"allow\",\n" + " \"resource\": [\n" + " \"acs:oss:*:*:ram-test/*\",\n" + " \"acs:oss:*:*:ram-test\"\n" + " ]\n" + " }\n" + " ],\n" + " \"version\": \"1\"\n" + "}"; try { // 添加endpoint(直接使用sts endpoint,前两个参数留空,无需添加region id) defaultprofile.addendpoint("", "", "sts", endpoint); // 构造default profile(参数留空,无需添加region id) iclientprofile profile = defaultprofile.getprofile("", accesskeyid, accesskeysecret); // 用profile构造client defaultacsclient client = new defaultacsclient(profile); final assumerolerequest request = new assumerolerequest(); request.setmethod(methodtype.post); request.setrolearn(rolearn); request.setrolesessionname(rolesessionname); request.setpolicy(policy); // optional request.setprotocol(protocoltype.https); // 必须使用https协议访问sts服务); final assumeroleresponse response = client.getacsresponse(request); credentials = response.getcredentials(); system.out.println("expiration: " + credentials.getexpiration()); system.out.println("access key id: " + credentials.getaccesskeyid()); system.out.println("access key secret: " + credentials.getaccesskeysecret()); system.out.println("security token: " + credentials.getsecuritytoken()); system.out.println("requestid: " + response.getrequestid()); } catch (clientexception e) { system.out.println("failed:"); system.out.println("error code: " + e.geterrcode()); system.out.println("error message: " + e.geterrmsg()); system.out.println("requestid: " + e.getrequestid()); } return credentials; }
5. 前端代码如下:(以上传oss文件为例)
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>oss demo</title> <input type="file" name="picfieldname" id="picfieldid" onchange="uploadpic(this)"/> <!-- 兼容ie --> <script src="https://www.promisejs.org/polyfills/promise-6.1.0.js"></script> <!-- oss 上传文件 javascript 库 --> <script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-4.3.0.min.js"></script> <script src="../../js/jquery.min.js"></script> <script> function uploadpic(obj) { //请求自己后台 获取sts等相关信息后,调用oss-sdk方法直传oss $.ajax({ url: "/ueditor/sts", success: function (result) { var client = new oss.wrapper({ region: 'oss-cn-beijing', accesskeyid: result.accesskeyid, accesskeysecret: result.accesskeysecret, bucket: 'rem-test', ststoken: result.securitytoken }); var file = obj.files[0];//获取文件流 var val = obj.value; var suffix = val.substr(val.indexof(".")); var storeas = "tally_ueditor/" + timestamp() + suffix; console.log(file.name + ' => ' + storeas); client.multipartupload(storeas, file).then(function (result) { console.log("result:" + json.stringify(result)); }).catch(function (err) { console.log("err:" + json.stringify(err)); }); } }); } /** * 生成文件名 * @returns */ function timestamp() { var time = new date(); var y = time.getfullyear(); var m = time.getmonth() + 1; var d = time.getdate(); var h = time.gethours(); var mm = time.getminutes(); var s = time.getseconds(); console.log(y); return "" + y + add0(m) + add0(d) + add0(h) + add0(mm) + add0(s); } function add0(m) { return m < 10 ? '0' + m : m; } </script> </head> <body> </body> </html>
6、前端上传时出现403错误,请进行跨域设置
如对本文有疑问, 点击进行留言回复!!
Android10相机拍摄保存照片并显示(解决各种闪退,添加v4包)
安裝ubuntu18.04安装android studio(1)
Codeforces Round #656 (Div. 3)D. a-Good String(递归+dfs)
网友评论