假设您是一个移动App开发者,希望使用阿里云OSS服务来保存App的终端用户数据,并且要保证每个App用户之间的数据隔离。此时,您可以使用STS授权用户直接访问OSS。
阿里云OSS官网文档地址:使用STS临时访问凭证访问OSS - 对象存储 OSS - 阿里云
目录
一、DEMO项目文件截图
二、DEMO项目代码片段
三、 访问接口运行结果
- App用户登录。App用户和云账号无关,它是App的终端用户,App服务器支持App用户登录。对于每个有效的App用户来说,需要App服务器能定义出每个App用户的最小访问权限。
- App服务器请求STS服务获取一个安全令牌(SecurityToken)。在调用STS之前,App服务器需要确定App用户的最小访问权限(用RAM Policy来自定义授权策略)以及凭证的过期时间。然后通过扮演角色(AssumeRole)来获取一个代表角色身份的安全令牌(SecurityToken)。
- STS返回给App服务器一个临时访问凭证,包括一个安全令牌(SecurityToken)、临时访问密钥(AccessKeyId和AccessKeySecret)以及过期时间。
- App服务器将临时访问凭证返回给App客户端,App客户端可以缓存这个凭证。当凭证失效时,App客户端需要向App服务器申请新的临时访问凭证。例如,临时访问凭证有效期为1小时,那么App客户端可以每30分钟向App服务器请求更新临时访问凭证。
- App客户端使用本地缓存的临时访问凭证去请求OSS API。OSS收到访问请求后,会通过STS服务来验证访问凭证,正确响应用户请求。
application.properties
#阿里云访问控制RAM子账户信息,需要登录阿里云控制台查看(Secret只在创建时可查看,需要做好备份) aliyun.oss.accessKeyId=LTAI5tRzx6VDpPA28wG6XHpb aliyun.oss.accessKeySecret=KqfbKGA48OiU8vrs6Ruwe9HzcLMbHq #角色ID,在角色中进行授权,获取相应的权限 aliyun.sts.roleArn=acs:ram::1481594054055183:role/ramosstest #指临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。自定义(可不设置) aliyun.sts.roleSessionName=RamOssTest
pom.xml
org.projectlombok lomboktrue com.aliyun aliyun-java-sdk-sts3.0.0 com.aliyun aliyun-java-sdk-core3.5.0
StsTokenVO.java
package com.csdn.vo; import lombok.Data; import java.io.Serializable; @Data public class StsTokenVO implements Serializable { private String accessKeyId; private String accessKeySecret; private String securityToken; }
StsTokenService.java
package com.csdn.service; import com.csdn.vo.StsTokenVO; public interface StsTokenService { StsTokenVO getStsToken(); }
StsTokenServiceImpl.java
package com.csdn.service; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest; import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse; import com.csdn.vo.StsTokenVO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service public class StsTokenServiceImpl implements StsTokenService { private static final Logger LOGGER = LoggerFactory.getLogger(StsTokenServiceImpl.class); @Value("${aliyun.oss.accessKeyId}") private String accessKeyId; @Value("${aliyun.oss.accessKeySecret}") private String accessKeySecret; @Value("${aliyun.sts.roleArn}") private String roleArn; @Value("${aliyun.sts.roleSessionName}") private String roleSessionName; private static final Long durationSeconds = 300L; private static final String ENDPOINT = "sts.aliyuncs.com"; @Override public StsTokenVO getStsToken() { StsTokenVO tokenVO = new StsTokenVO(); 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.setDurationSeconds(durationSeconds); // 针对该临时权限可以根据该属性赋予规则,格式为json,没有特殊要求,默认为空 // request.setPolicy(policy); // Optional final AssumeRoleResponse response = client.getAcsResponse(request); AssumeRoleResponse.Credentials credentials = response.getCredentials(); tokenVO.setAccessKeyId(credentials.getAccessKeyId()); tokenVO.setAccessKeySecret(credentials.getAccessKeySecret()); tokenVO.setSecurityToken(credentials.getSecurityToken()); return tokenVO; } catch (ClientException e) { LOGGER.error("获取阿里云STS临时授权权限失败,错误信息:" + e); return null; } } }
StsTokenController.java
package com.csdn.controller; import com.csdn.service.StsTokenService; import com.csdn.vo.StsTokenVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api") public class StsTokenController { @Autowired private StsTokenService stsTokenService; @GetMapping("/oss/token") public StsTokenVO getToken() { return stsTokenService.getStsToken(); } }三、 访问接口运行结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)