server {
listen 9000;
server_name localhost;
location /file/ {
alias D:/ycjlUpload/uploadPath/;
# 启用权限校验,调用反向代理
auth_request /auth;
auth_request_set $auth_status $upstream_status;
# 从查询?拼接参数中获取 token,并赋值给token变量
set $token $arg_token;
}
#反向代理接口 http://localhost:8080/authNginx
location = /auth {
internal; # 仅允许内部请求
proxy_pass http://localhost:8080/authNginx; # 转发到 Spring Boot 应用
proxy_pass_request_body off; # 不传递请求体
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
# 从 URL 参数中提取 Token 并传递给 Spring Boot
#proxy_set_header Authorization "Bearer $arg_token";
# 请求头的Authorization 的值为上面token变量
#proxy_set_header Authorization "$token";
# 从 URL 参数中提取 Token 并传递给 Spring Boot
proxy_set_header Authorization "Bearer $token";
}
}
2:nginx获取文件url的?token的数据,并设为nginx变量token,
nginx反向代理执行后端接口http://localhost:8080/authNginx
传递参数变量token给接口的请求头的Authorization
3:后端获取Authorization的token判断是否可用,可以则返回代码200,nginx通行允许访问文件
token不可用则403nginx文件不可访问
注意:该接口要白名单
package com.ruoyi.web.controller.system;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.framework.web.service.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.Objects;
@RestController
public class AuthController {
@Autowired
private TokenService tokenService;
//nginx校验token
@GetMapping("/authNginx")
public ResponseEntity<Object> auth(@RequestHeader(value = "Authorization") String token, HttpServletRequest request) {
System.out.println("authNginx的token"+token);
LoginUser loginUser = tokenService.getLoginUser(request);//根据请求头的token获取用户信息
// 去掉 "Bearer " 前缀获取真正的token
//String actualToken = token.replace("Bearer ", "");
//String authorization = request.getHeader("Authorization");
if (Objects.isNull(loginUser)){
// AjaxResult.error("token过期");
ResponseEntity<Object> build = ResponseEntity.status(HttpStatus.FORBIDDEN).build();
return build;
}else {
ResponseEntity<Object> build = ResponseEntity.ok().build();
return build;
// tokenService.verifyToken(loginUser);
}
// if ("your_secret_token".equals(token)) {
// return ResponseEntity.ok().build();
// } else {
// return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
// }
}
}
4:访问