Kaynağa Gözat

更新 ObjectGetController 中对请求资源可见范围的判断和处理

reghao 2 yıl önce
ebeveyn
işleme
9cd50c40bc

+ 9 - 3
oss-store/src/main/java/cn/reghao/oss/store/controller/ObjectGetController.java

@@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -58,9 +59,14 @@ public class ObjectGetController {
             return;
         }
 
-        if (objectName.startsWith("/image/a/") || objectName.startsWith("/image/i/") || objectName.startsWith("/img/")) {
-            getObjectService.getObject(objectName);
-            return;
+        List<String> list = objectChannelService.getPublicChannels();
+        if (!list.isEmpty()) {
+            for (String prefix : list) {
+                if (objectName.startsWith(prefix)) {
+                    getObjectService.getObject(objectName);
+                    return;
+                }
+            }
         }
 
         String queryString = String.format("token=%s&t=%s&nonce=%s", token, timestamp, nonce);

+ 19 - 0
oss-store/src/main/java/cn/reghao/oss/store/service/ObjectChannelService.java

@@ -1,11 +1,15 @@
 package cn.reghao.oss.store.service;
 
 import cn.reghao.jutil.jdk.machine.id.MachineId;
+import cn.reghao.oss.api.constant.ObjectScope;
 import cn.reghao.oss.api.dto.ObjectChannel;
 import cn.reghao.oss.sdk.OssConsoleClient;
 import cn.reghao.oss.store.util.UserContext;
 import org.springframework.stereotype.Service;
 
+import java.util.*;
+import java.util.stream.Collectors;
+
 /**
  * @author reghao
  * @date 2024-02-28 11:05:34
@@ -31,4 +35,19 @@ public class ObjectChannelService {
 
         return null;
     }
+
+    public List<String> getPublicChannels() {
+        String nodeAddr = machineId.ipv4();
+        try {
+            List<ObjectChannel> list = ossConsoleClient.getObjectChannels(nodeAddr);
+            return list.stream()
+                    .filter(objectChannel -> Objects.equals(objectChannel.getScope(), ObjectScope.PUBLIC.getCode()))
+                    .map(ObjectChannel::getPrefix)
+                    .collect(Collectors.toList());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return Collections.emptyList();
+    }
 }