Sfoglia il codice sorgente

调整 ObjectGetController 中对请求资源可见范围的判断和处理, 直接根据每个资源的 scope 值来判断是否需要验证签名

reghao 2 anni fa
parent
commit
7a89b4d07f

+ 3 - 0
oss-store/src/main/java/cn/reghao/oss/store/config/OssProperties.java

@@ -17,8 +17,11 @@ import java.util.List;
 @ConfigurationProperties(prefix = "oss")
 public class OssProperties {
     private String consoleEndpoint;
+    @Deprecated
     private String domain;
     private List<String> diskDirs;
+    @Deprecated
     private String secretKey;
+    @Deprecated
     private String referer;
 }

+ 17 - 16
oss-store/src/main/java/cn/reghao/oss/store/controller/ObjectGetController.java

@@ -1,8 +1,11 @@
 package cn.reghao.oss.store.controller;
 
 import cn.reghao.oss.store.api.constant.ChannelAction;
+import cn.reghao.oss.store.api.constant.ObjectScope;
 import cn.reghao.oss.store.api.dto.ObjectChannel;
+import cn.reghao.oss.store.api.dto.ObjectMeta;
 import cn.reghao.oss.store.config.OssProperties;
+import cn.reghao.oss.store.db.repository.ObjectRepository;
 import cn.reghao.oss.store.service.GetObjectService;
 import cn.reghao.oss.store.service.ObjectChannelService;
 import cn.reghao.oss.store.util.JwtUtil;
@@ -15,7 +18,6 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -28,13 +30,15 @@ public class ObjectGetController {
     private final Cache<String, String> cache;
     private final OssProperties ossProperties;
     private final ObjectChannelService objectChannelService;
+    private final ObjectRepository objectRepository;
 
     public ObjectGetController(GetObjectService getObjectService, OssProperties ossProperties,
-                               ObjectChannelService objectChannelService) {
+                               ObjectChannelService objectChannelService, ObjectRepository objectRepository) {
         this.getObjectService = getObjectService;
         this.cache = Caffeine.newBuilder().maximumSize(10_000).expireAfterAccess(1, TimeUnit.HOURS).build();
         this.ossProperties = ossProperties;
         this.objectChannelService = objectChannelService;
+        this.objectRepository = objectRepository;
     }
 
     @RequestMapping(value = "/**", method = RequestMethod.HEAD)
@@ -54,19 +58,16 @@ public class ObjectGetController {
                           @RequestParam(value = "sign", required = false) String sign,
                           @RequestParam(value = "client", required = false) String client) throws IOException {
         String objectName = ObjectUtil.getObjectName();
-        if (client != null && !client.isBlank()) {
-            getObjectService.getObject(objectName);
+        ObjectMeta objectMeta = objectRepository.getObjectMeta(objectName);
+        if (objectMeta == null) {
+            getObjectService.writeResponse(HttpServletResponse.SC_NOT_FOUND);
+            return;
+        } else if (client != null && !client.isBlank()) {
+            getObjectService.getObject(objectMeta);
+            return;
+        } else if (objectMeta.getScope() == ObjectScope.PUBLIC.getCode()) {
+            getObjectService.getObject(objectMeta);
             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);
@@ -114,9 +115,9 @@ public class ObjectGetController {
 
         String action = ossPayload.getAction();
         if (ChannelAction.access.getName().equals(action)) {
-            getObjectService.getObject(objectName);
+            getObjectService.getObject(objectMeta);
         } else if (ChannelAction.download.getName().equals(action)) {
-            getObjectService.downloadObject(objectName);
+            getObjectService.writeDownloadContent(objectMeta);
         } else {
             String payload = String.format("channel action %s not matched", action);
             getObjectService.writeResponse(HttpServletResponse.SC_FORBIDDEN, payload);

+ 5 - 14
oss-store/src/main/java/cn/reghao/oss/store/service/GetObjectService.java

@@ -26,12 +26,10 @@ public class GetObjectService {
     private final FileMetaMapper fileMetaMapper;
     // 1MiB
     private final int bufSize = 1024*1024;
-    private final ObjectRepository objectRepository;
     private final String domain;
 
-    public GetObjectService(FileMetaMapper fileMetaMapper, ObjectRepository objectRepository, OssProperties ossProperties) {
+    public GetObjectService(FileMetaMapper fileMetaMapper, OssProperties ossProperties) {
         this.fileMetaMapper = fileMetaMapper;
-        this.objectRepository = objectRepository;
         this.domain = ossProperties.getDomain();
     }
     
@@ -75,15 +73,8 @@ public class GetObjectService {
         outputStream.close();
     }
 
-    public void getObject(String objectName) throws IOException {
+    public void getObject(ObjectMeta objectMeta) throws IOException {
         String host = ServletUtil.getRequest().getHeader("host");
-
-        ObjectMeta objectMeta = objectRepository.getObjectMeta(objectName);
-        if (objectMeta == null) {
-            writeResponse(HttpServletResponse.SC_NOT_FOUND);
-            return;
-        }
-
         long len = objectMeta.getSize();
         String range = ServletUtil.getRequest().getHeader("range");
         if (range != null) {
@@ -98,7 +89,7 @@ public class GetObjectService {
         }
     }
 
-    public void downloadObject(String objectName) throws IOException {
+    /*public void downloadObject(String objectName) throws IOException {
         ObjectMeta objectMeta = objectRepository.getObjectMeta(objectName);
         if (objectMeta == null) {
             writeResponse(HttpServletResponse.SC_NOT_FOUND);
@@ -106,7 +97,7 @@ public class GetObjectService {
         }
 
         writeDownloadContent(objectMeta);
-    }
+    }*/
 
     public void writeResponse(int statusCode) throws IOException {
         HttpServletResponse response = ServletUtil.getResponse();
@@ -159,7 +150,7 @@ public class GetObjectService {
         writeResponse(outputStream, absolutePath, start, end);
     }
 
-    private void writeDownloadContent(ObjectMeta objectMeta) throws IOException {
+    public void writeDownloadContent(ObjectMeta objectMeta) throws IOException {
         HttpServletResponse response = ServletUtil.getResponse();
         response.setStatus(HttpServletResponse.SC_OK);
         response.setContentType(objectMeta.getContentType());

+ 1 - 3
oss-store/src/main/java/cn/reghao/oss/store/service/ObjectChannelService.java

@@ -1,7 +1,6 @@
 package cn.reghao.oss.store.service;
 
 import cn.reghao.jutil.jdk.machine.id.MachineId;
-import cn.reghao.oss.store.api.constant.ObjectScope;
 import cn.reghao.oss.store.api.dto.ObjectChannel;
 import cn.reghao.oss.sdk.OssConsoleClient;
 import cn.reghao.oss.store.util.UserContext;
@@ -36,12 +35,11 @@ public class ObjectChannelService {
         return null;
     }
 
-    public List<String> getPublicChannels() {
+    public List<String> getAllChannelPrefix() {
         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) {