nginx文件服务结合后端token校验,nginx调用反向代理后端接口,接口返回代码是否nginx文件可以访问

	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:访问

http://localhost:9000/file/2025/03/07/cover_20250307160829A015.png?token=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjhlYTMyMzRkLTQ4NDAtNDllZC1hNzBkLWZmNzUzNTkxNzNiYSJ9.Gs6QKypuUJDIxV1Q8Px1tHC1id7bxdeCLLlzp5hhhwDeraDNCWoBz6ZzQ9aDDRcSL6jNL33Wa4R2ih_GrznS1A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值