我有一个配置为网站的存储桶,并且存储桶策略允许公开访问该存储桶中除“/_admin/”文件夹之外的所有文件夹。仅允许发出请求的特定 Iam 用户访问“/_admin/”。这是用于网站的后端管理,所以我向用户提供 html、js、css 等。现在,我正在使用 aws javascript sdk 将每个 url 签名为 js/css/img src/href 链接,然后更新该属性或创建它。 (这意味着几乎没有任何内容被缓存,因为每次访问时签名都会发生变化。)我已经证明了这个概念,并且我可以通过签署网页中的每个网址来访问文件,但这似乎是构建网站的一种尴尬的方式。
有没有一种方法可以向每个请求中包含的每个页面添加某种访问 header ?如果是这样,这也适用于所有 ajax 类型请求吗?
最佳答案
这是我为解决这个问题而想出的办法。我修改了我的存储桶策略,拒绝对“/_admin/”的所有匿名访问,除非它来 self 的主账户 ID、特定的 Iam 用户,或者引用网址 URL 与特定 token 匹配。用户从我网站上的可公开访问的页面进行身份验证后,我生成一个新 token ,然后使用 sdk 使用该新 token 的值修改存储桶策略。 (我可能还会添加另一个带有到期日期的条件。)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::test-domain-structure/*"
},
{
"Sid": "AllowAdminWithToken",
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::AWS-USER-ID:user/IAM-USER",
"arn:aws:iam::AWS-USER-ID:root"
]
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::test-domain-structure/_admin/*",
"Condition": {
"StringNotLike": {
"aws:Referer": "*?t=a77Pn"
}
}
}
]
}
在每个页面中,我使用 javascript 在每个链接/href 前面添加新的查询字符串(?t=a77Pn ...或新生成的 token )。
编辑:那真的很痛苦。链接不断断开,所以最终我采用了下面的解决方案,加上过期日期的附加条件。效果更好。
另一个选项是修改存储桶策略以仅允许来自特定 IP 地址的访问。这将消除修改所有链接/href 并保持 url 干净的必要。仍然对更好的想法持开放态度,但这目前有效。
关于javascript - 管理浏览器中 s3 文件夹的访问 - 最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33622778/