gpt4 book ai didi

java - 当请求通过 servlet 重定向到 S3 存储桶时,S3 存储桶策略不起作用

转载 作者:行者123 更新时间:2023-12-01 19:18:36 26 4
gpt4 key购买 nike

  1. 我们有一个 java servlet 应用程序,它将请求重定向到 s3 存储桶 html 文件,例如,
String htmlURL = "https://s3_bucket.s3.amazonaws.com/118/vtour/tour.html";
resp.sendRedirect(url);
  • servlet 应用程序部署在 tomcat 服务器上,所有这些网络配置都通过 nginx 代理 channel 维护。 nginx 在不同的机器上运行。 Nginx 配置为:
  •     location /JavaServletApp {
    proxy_pass http://ip_address_of_tomcat_server:8080;
    }

    在 s3 上,我们添加了存储桶策略,仅允许访问特定 IP 地址,如下所示:(理想情况下,我们希望将源 IP 设置为仅 nginx 服务器的源 IP)。 tomcat 服务器不得公开访问)

    {
    "Version": "2012-10-17",
    "Id": "Policy1576643187337",
    "Statement": [
    {
    "Sid": "Stmt1576643184762",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::s3_bucket/*",
    "Condition": {
    "IpAddress": {
    "aws:SourceIp": [
    "nginx_server_ip",
    "tomcat_server_public_ip",
    "tomcat_server_private_ip",
    ]
    }
    }
    }
    ]
    }

    注意:S3 存储桶是公共(public)的。

    如果我们尝试通过 https://nginx/JavaServlet 渲染 s3 html 文件应用程序,它会给出“访问被拒绝”错误。但是,如果我们通过curl从nginx服务器直接(没有servlet应用程序)点击s3存储桶html文件,那么该html文件就会被渲染。

    如果我们将本地笔记本电脑的 IP 地址(公共(public)网关 IP)添加到 s3 存储桶策略中,那么如果我们点击 https://nginx/JavaServlet app,S3上的html被渲染。但这不是一个可行的解决方案。

    另外,尝试将Referer设置为nginx-host,在nginx配置中,我们仍然无法通过https://nginx/JavaServlet访问S3上的html应用程序。

    Workflow

    最佳答案

    正如@Michel所说,因为你使用:

    resp.sendRedirect(url);

    存储桶将接收来自客户端浏览器的请求,因此您无法为其应用良好的策略。

    AWS 处理这种情况的方法是使用 GeneratePresignedURL并将客户端重定向到生成的 URL。

    关于java - 当请求通过 servlet 重定向到 S3 存储桶时,S3 存储桶策略不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59388651/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com