OSS在private权限下的无参数访问(Nginx反向代理实现) ...

本文介绍利用nginx反向代理实现private权限下无参数访问oss资源。运行环境为Centos7系统 + nginx 1.14.1,前期需安装nginx的njs模块、创建脚本文件、修改nginx相关配置文件,最后重启nginx,即可在浏览器正常访问oss资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要介绍内容

oss默认权限策略是private,当修改到public-read或更高权限时会提示存在安全风险。如果需要访问oss资源需要在地址上添加签名内容,不利于地址的存储和使用。本文会介绍如何利用nginx反向代理实现private权限下无参数访问oss资源。


运行环境说明

本文实现环境是:
Centos7 系统 + nginx: 1.14.1


前期准备工作

  • nginx安装njs模块(使用yum安装,也可源码编译安装)

yum install nginx-module-njs

  • 创建脚本文件

本文是将脚本放置与nginx/njs/目录下,文件名为oss-sign.js,你也可以放置到任何你喜欢的地方,只要以下提到的配置目录正确即可。

文件内容详见 代码文件

  • 修改nginx相关配置文件

修改nginx/nginx.conf文件,修改内容如下,非修改内容省略

#--start-- 引入njs模块 
load_module modules/ngx_http_js_module.so;
#--end--

http {
  #--start-- 
  # 以上内容省略,这段代码需放置与include之前, http代码段之中
  # js_include指令后接脚本文件路径
  js_include njs/oss-sign.js;
  # 定义签名字符串和GMT时间字符串
  js_set $ossDate getGMTtime;
  js_set $ossAuth ossSign;
  #--end--

  include /etc/nginx/conf.d/*.conf;
}
  • 虚拟服务主机方式

conf.d/目录下创建oss.conf文件,内容如下

server {
    server_name  oss.xxxxx.com; # oss域名,替换成你自己的域名
    server_name_in_redirect off; # 多域名防干扰,详细说明可自行查阅

    location / {
      # 反向代理oss地址,需替换成你的oss内网或外网地址
      proxy_pass http://xxx.oss-cn-xxx-internal.aliyuncs.com;
      # 设置反向代理时请求header, 也是本方案核心内容
      # $ossDate, $ossAuth 变量名需和nginx.conf文件内变量名一致
      proxy_set_header Date $ossDate;
      proxy_set_header Authorization $ossAuth;
    }

}
  • 其他方式

具体内容视情况而定,但主要是反向代理时添加的header字段,和上面类似

  • 重启nginx

service nginx restart

其他系统可视具体文档


结束

接下来就是见证奇迹的时刻!在浏览器里输入你的域名 + oss资源路径,然后按回车,如果不出意外,图片就能正常显示了。

_

脚本具体代码

oss-sign.js

/* 
  创建待签名字符串 
  此方法为简化版,仅处理不带url参数的oss资源地址,其他情况可结合oss文档 + ali-oss sdk 文件内signUtil模块内的buildCanonicalString方法做修改
*/
function buildCanonicalString (method, resourcePath, date) {
  var signContent = [method.toUpperCase(), '', '', date, resourcePath]
  return signContent.join('\n')
}
/* 计算签名字符串 */
function computeSignature (accessKeySecret, canonicalString) {
  var signature = require('crypto').createHmac('sha1', accessKeySecret)
  return signature.update(canonicalString.toUTF8()).digest('base64')
}
/* 生成完整认证字符串 */
function authorization (accessKeyId, accessKeySecret, canonicalString) {
  return 'OSS ' + accessKeyId + ':' + computeSignature(accessKeySecret, canonicalString)
}
/* oss签名配置数据,换成你自己的PAM账号的AK和bucket */
var ossAccess = {
  accessKeyId: 'XXXXX',
  accessKeySecret: 'XXXX',
  bucket: 'XXX'
}
var GMTdate = ''
/* 返回oss header date字符串 */
function getGMTtime (r) {
  /* 函数运行在http环境,如果有多个server最好加上判断条件来避免不必要的消耗 */
  if (r.headersIn.host !== 'oss.xxxx.com') return ''
  /* nginx 环境下 toUTCString 函数和标准有差异, 此处做转换处理,后续njs版本升级后可能需要修改 */
  var dateWords = new Date().toUTCString().split(' ')
  dateWords[0] += ','
  dateWords[1] = [dateWords[2], dateWords[2] = dateWords[1]][0]
  GMTdate = dateWords.join(' ')
  return GMTdate
}
/* 返回oss header authorization字符串 */
function ossSign (r) {
  if (r.headersIn.host !== 'oss.xxxx.com') return ''
  var method = r.method
  var canonicalString = buildCanonicalString(method, '/' + ossAccess.bucket + r.uri, GMTdate)
  return authorization(ossAccess.accessKeyId, ossAccess.accessKeySecret, canonicalString)
}
<think>嗯,用户想在openEuler 24.09上搭建一个网站,有文件上传下载、用户认证、资源搜索这些功能。前端用HTML5/CSS/JavaScript,后端用Java Spring,数据库存储账号密码,还要支持HTTPS和数据加密。我需要一步步帮他们解决怎么安装配置Nginx和Java Spring,以及数据库的设置。 首先,系统环境方面,用户用的是openEuler 24.09,可能需要先更新系统,安装必要的依赖。比如Java环境,因为后端用Spring,可能需要JDK 17或者更高版本。然后安装Maven或者Gradle来构建项目,还有MySQL或PostgreSQL作为数据库。另外,Nginx作为反向代理和静态资源服务器,需要安装配置。 接下来是安装步骤。先安装Nginx,用dnf安装应该没问题。然后配置Nginx,可能需要设置监听443端口,配置SSL证书,用Let's Encrypt的certbot工具获取证书。同时,配置反向代理到后端的Spring应用,比如转发到8080端口。 然后是Java Spring的安装。需要安装JDK,这里建议用OpenJDK 17,然后安装构建工具。创建Spring Boot项目,整合Spring Security做用户认证,处理密码加密存储,可能用BCrypt。数据库方面,配置数据源,使用JPA或者MyBatis进行数据库操作,比如存储用户信息和文件元数据。 数据库部分,安装MySQL之后,创建数据库和用户表,字段包括用户名、加密后的密码、角色等。可能需要用Flyway或者Liquibase做数据库迁移,确保表结构正确。 HTTPS配置方面,Nginx需要配置SSL证书,设置强密码套件,启用HSTS,可能还要配置HTTP到HTTPS的重定向。后端Spring应用可能需要配置CORS,允许前端域名的请求,同时确保通信通过HTTPS。 文件上传下载功能,后端Spring需要处理Multipart文件上传,存储到指定目录,可能用本地存储或者OSS。数据库里记录文件的元数据,比如文件名、路径、上传者、分类等。下载时通过后端提供接口,或者直接由Nginx处理静态文件。 资源搜索的话,可能需要根据文件名、分类等字段在数据库中进行查询,或者用更复杂的搜索引擎如Elasticsearch,但用户需求可能基础,先用SQL的LIKE语句或者全文检索功能。 前端部分,用HTML/CSS/JS构建界面,可能需要用到Ajax或Fetch API与后端交互。上传文件用FormData,显示分类目录和搜索结果,用动态生成HTML元素的方式。考虑使用Vue.js或React框架,但用户没有提到,可能保持简单。 安全方面,后端用Spring Security处理用户认证,密码加密存储,使用HTTPS加密通信。防止CSRF、XSS攻击,对上传文件做类型和大小限制,避免恶意文件上传。 测试环节,需要确保各功能正常,用户能注册登录,上传下载文件,搜索资源,所有通信都是HTTPS。还要检查性能,是否需要用Redis做缓存,或者优化数据库查询。 可能遇到的问题:Nginx配置错误导致无法访问后端,SSL证书配置不当,Spring Security的权限设置问题,文件存储路径权限不足,数据库连接失败等。需要逐步排查日志,检查配置文件的语法,确保端口开放,服务正常运行。 最后,生成相关问题,可能涉及性能优化、扩展功能、安全加固、部署运维等方面的问题。比如如何优化文件上传性能,如何实现多文件上传,如何备份数据库,如何监控系统资源等。</think>### 分步解决方案 #### 一、系统环境准备 1. 更新系统并安装基础依赖: ```bash sudo dnf update -y sudo dnf install -y git wget curl vim ``` 2. 安装Nginx: ```bash sudo dnf install -y nginx sudo systemctl enable --now nginx ``` 3. 安装Java环境: ```bash sudo dnf install -y java-17-openjdk-devel maven ``` 4. 安装MySQL数据库: ```bash sudo dnf install -y mysql-server sudo systemctl enable --now mysqld ``` #### 二、Nginx配置HTTPS 1. 获取SSL证书(以Let's Encrypt为例): ```bash sudo dnf install -y certbot python3-certbot-nginx sudo certbot --nginx -d your-domain.com ``` 2. 配置Nginx反向代理到Spring应用(示例配置片段): ```nginx server { listen 443 ssl; server_name your-domain.com; ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 静态文件托管(可选) location /static/ { root /var/www/html; } } ``` #### 三、Spring Boot后端开发 1. 创建Spring Boot项目(整合Spring Security和JPA): ```xml <!-- pom.xml 关键依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 2. 数据库配置(application.properties): ```properties spring.datasource.url=jdbc:mysql://localhost:3306/file_manager spring.datasource.username=root spring.datasource.password=your_password spring.jpa.hibernate.ddl-auto=update ``` 3. 用户实体与密码加密存储: ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; // BCrypt加密存储 // 其他字段... } ``` 4. 文件上传接口实现: ```java @PostMapping("/upload") public String handleUpload(@RequestParam("file") MultipartFile file) { String fileName = file.getOriginalFilename(); Path path = Paths.get("/var/uploads/" + fileName); Files.write(path, file.getBytes()); return "上传成功"; } ``` #### 四、前端开发要点 1. 文件上传表单示例: ```html <form id="uploadForm"> <input type="file" id="fileInput"> <button onclick="uploadFile()">上传</button> </form> <script> function uploadFile() { const formData = new FormData(); formData.append('file', document.getElementById('fileInput').files[0]); fetch('/api/upload', { method: 'POST', body: formData }).then(response => response.json()); } </script> ``` 2. HTTPS通信强制配置(Spring Security): ```java @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.requiresChannel() .requestMatchers(r -> r.getHeader("X-Forwarded-Proto") != null) .requiresSecure(); } } ``` #### 五、数据库安全增强 1. 密码加密存储实现: ```java @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } ``` 2. SQL注入防护(使用JPA规范): ```java public interface FileRepository extends JpaRepository<File, Long> { @Query("SELECT f FROM File f WHERE f.name LIKE %:keyword%") List<File> searchFiles(@Param("keyword") String keyword); } ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值