xiatian há 7 meses atrás
pai
commit
22bfbbb391

+ 5 - 1
pom.xml

@@ -51,7 +51,11 @@
             <artifactId>tools-poi</artifactId>
             <version>${qmth-boot-version}</version>
         </dependency>
-
+		<dependency>
+		    <groupId>com.qmth.boot</groupId>
+		    <artifactId>core-cache</artifactId>
+		    <version>${qmth-boot-version}</version>
+		</dependency>
 
         <!-- Swagger jars start -->
         <dependency>

+ 25 - 0
src/main/java/cn/com/qmth/markingaudit/bean/AkInfo.java

@@ -0,0 +1,25 @@
+package cn.com.qmth.markingaudit.bean;
+
+public class AkInfo {
+
+    private String accessKey;
+
+    private String accessSecret;
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getAccessSecret() {
+        return accessSecret;
+    }
+
+    public void setAccessSecret(String accessSecret) {
+        this.accessSecret = accessSecret;
+    }
+
+}

+ 18 - 0
src/main/java/cn/com/qmth/markingaudit/config/CaffeineConfig.java

@@ -0,0 +1,18 @@
+package cn.com.qmth.markingaudit.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+
+import cn.com.qmth.markingaudit.support.CaffeineExpiry;
+
+@Configuration
+public class CaffeineConfig {
+
+    @Bean
+    public Cache<String, Object> caffeineCache() {
+        return Caffeine.newBuilder().expireAfter(new CaffeineExpiry()).initialCapacity(100).maximumSize(1000).build();
+    }
+}

+ 3 - 0
src/main/java/cn/com/qmth/markingaudit/dao/MonitorDao.java

@@ -4,6 +4,7 @@ import java.util.List;
 
 import org.apache.ibatis.annotations.Param;
 
+import cn.com.qmth.markingaudit.bean.AkInfo;
 import cn.com.qmth.markingaudit.bean.ExamDataQuery;
 import cn.com.qmth.markingaudit.bean.ExamDataVo;
 import cn.com.qmth.markingaudit.bean.InspectDataInfo;
@@ -56,4 +57,6 @@ public interface MonitorDao {
 
     List<LoginDataVo> loginData(@Param("req") LoginDataQuery req);
 
+    AkInfo getAk(@Param("schoolCode") String schoolCode);
+
 }

+ 3 - 0
src/main/java/cn/com/qmth/markingaudit/service/MonitorService.java

@@ -2,6 +2,7 @@ package cn.com.qmth.markingaudit.service;
 
 import java.util.List;
 
+import cn.com.qmth.markingaudit.bean.AkInfo;
 import cn.com.qmth.markingaudit.bean.ExamDataQuery;
 import cn.com.qmth.markingaudit.bean.ExamDataVo;
 import cn.com.qmth.markingaudit.bean.InspectDataQuery;
@@ -44,4 +45,6 @@ public interface MonitorService {
 
     List<LoginDataVo> loginData(LoginDataQuery req);
 
+    AkInfo getAk(String schoolCode);
+
 }

+ 25 - 10
src/main/java/cn/com/qmth/markingaudit/service/impl/AuthServiceImpl.java

@@ -1,31 +1,46 @@
 package cn.com.qmth.markingaudit.service.impl;
 
-import java.security.NoSuchAlgorithmException;
+import java.util.concurrent.TimeUnit;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import com.qmth.boot.core.exception.StatusException;
 import com.qmth.boot.core.security.annotation.AuthorizationComponent;
 import com.qmth.boot.core.security.service.AuthorizationService;
 import com.qmth.boot.tools.signature.SignatureType;
 
+import cn.com.qmth.markingaudit.bean.AkInfo;
+import cn.com.qmth.markingaudit.service.MonitorService;
 import cn.com.qmth.markingaudit.support.AccessInfo;
 import cn.com.qmth.markingaudit.support.CustConstants;
-import cn.com.qmth.markingaudit.utils.MD5Util;
+import cn.com.qmth.markingaudit.utils.AuthorizationCreateUtil;
 
 @Service
 @AuthorizationComponent(prefix = { CustConstants.URI_PREFIX }, type = SignatureType.SECRET)
 public class AuthServiceImpl implements AuthorizationService<AccessInfo> {
 
+    @Autowired
+    private CaffeineCacheService caffeineCacheService;
+
+    @Autowired
+    private MonitorService monitorService;
+
     @Override
     public AccessInfo findByIdentity(String identity, SignatureType signatureType, String path) {
-        try {
-            StringBuilder temp = new StringBuilder(identity);
-            temp.reverse();
-            temp.append(CustConstants.QMTH);
-            String secret = MD5Util.encoder(temp.toString());
-            return new AccessInfo(identity, secret, identity);
-        } catch (NoSuchAlgorithmException e) {
-            throw new RuntimeException(e);
+        String secret = caffeineCacheService.get(identity);
+        if (secret == null) {
+            AkInfo ak = getAk(identity);
+            if (ak == null) {
+                throw new StatusException("未找到学校信息,code 错误");
+            }
+            secret = AuthorizationCreateUtil.buildApiSecret(ak.getAccessKey(), ak.getAccessSecret());
+            caffeineCacheService.set(identity, secret, 5, TimeUnit.MINUTES);
         }
+        return new AccessInfo(identity, secret);
+    }
+
+    private AkInfo getAk(String schoolCode) {
+        return monitorService.getAk(schoolCode);
     }
 }

+ 26 - 0
src/main/java/cn/com/qmth/markingaudit/service/impl/CaffeineCacheService.java

@@ -0,0 +1,26 @@
+package cn.com.qmth.markingaudit.service.impl;
+
+import java.util.concurrent.TimeUnit;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.github.benmanes.caffeine.cache.Cache;
+
+@Component
+public class CaffeineCacheService {
+
+    @Autowired
+    Cache<String, Object> caffeineCache;
+
+    public void set(String key, Object value, long duration, TimeUnit unit) {
+        caffeineCache.policy().expireVariably().ifPresent(e -> {
+            e.put(key, value, duration, unit);
+        });
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T> T get(String key) {
+        return (T) caffeineCache.getIfPresent(key);
+    }
+}

+ 6 - 0
src/main/java/cn/com/qmth/markingaudit/service/impl/MonitorServiceImpl.java

@@ -14,6 +14,7 @@ import org.springframework.stereotype.Service;
 import com.alibaba.fastjson.JSONObject;
 import com.qmth.boot.core.exception.StatusException;
 
+import cn.com.qmth.markingaudit.bean.AkInfo;
 import cn.com.qmth.markingaudit.bean.ExamDataQuery;
 import cn.com.qmth.markingaudit.bean.ExamDataVo;
 import cn.com.qmth.markingaudit.bean.InspectDataInfo;
@@ -270,4 +271,9 @@ public class MonitorServiceImpl implements MonitorService {
         return monitorDao.loginData(req);
     }
 
+    @Override
+    public AkInfo getAk(String schoolCode) {
+        return monitorDao.getAk(schoolCode);
+    }
+
 }

+ 2 - 2
src/main/java/cn/com/qmth/markingaudit/support/AccessInfo.java

@@ -10,11 +10,11 @@ public class AccessInfo implements AccessEntity {
 
     private String schoolCode;
 
-    public AccessInfo(String accessKey, String accessSecret, String schoolCode) {
+    public AccessInfo(String accessKey, String accessSecret) {
         super();
         this.accessKey = accessKey;
         this.accessSecret = accessSecret;
-        this.schoolCode = schoolCode;
+        this.schoolCode = accessKey;
     }
 
     public String getAccessSecret() {

+ 26 - 0
src/main/java/cn/com/qmth/markingaudit/support/CaffeineExpiry.java

@@ -0,0 +1,26 @@
+package cn.com.qmth.markingaudit.support;
+
+import org.checkerframework.checker.index.qual.NonNegative;
+import org.springframework.lang.NonNull;
+
+import com.github.benmanes.caffeine.cache.Expiry;
+
+public class CaffeineExpiry implements Expiry<String, Object> {
+
+    @Override
+    public long expireAfterCreate(@NonNull String key, @NonNull Object value, long currentTime) {
+        return 0;
+    }
+
+    @Override
+    public long expireAfterUpdate(@NonNull String key, @NonNull Object value, long currentTime,
+            @NonNegative long currentDuration) {
+        return currentDuration;
+    }
+
+    @Override
+    public long expireAfterRead(@NonNull String key, @NonNull Object value, long currentTime,
+            @NonNegative long currentDuration) {
+        return currentDuration;
+    }
+}

+ 9 - 5
src/main/java/cn/com/qmth/markingaudit/utils/AuthorizationCreateUtil.java

@@ -2,7 +2,8 @@ package cn.com.qmth.markingaudit.utils;
 
 import java.security.NoSuchAlgorithmException;
 
-import cn.com.qmth.markingaudit.support.CustConstants;
+import com.qmth.boot.tools.codec.CodecUtils;
+import com.qmth.boot.tools.models.ByteArray;
 
 /**
  * 后台生成签名工具类
@@ -10,10 +11,13 @@ import cn.com.qmth.markingaudit.support.CustConstants;
 public class AuthorizationCreateUtil {
 
     public static void main(String[] args) throws NoSuchAlgorithmException {
-        StringBuilder token = new StringBuilder("test-school-3");
-        token.reverse();
-        token.append(CustConstants.QMTH);
-        System.out.println(MD5Util.encoder(token.toString()));
+        String accessKey = "0315b78010974ce4baedd8005dc2b834";
+        String accessSecret = "XwaMV27j1c39rHBBucSSJYvUmf7SGdNi";
+        System.out.println(buildApiSecret(accessKey, accessSecret));
     }
 
+    public static String buildApiSecret(String accessKey, String accessSecret) {
+        return ByteArray.fromArray(CodecUtils.hmacsha256(accessKey.getBytes(), accessSecret.getBytes())).toHexString()
+                .toLowerCase();
+    }
 }

+ 7 - 0
src/main/resources/mapper/MonitorMapper.xml

@@ -1,6 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.qmth.markingaudit.dao.MonitorDao">
+
+	<select id="getAk" resultType="cn.com.qmth.markingaudit.bean.AkInfo">
+		select s.access_key,s.access_secret
+		from b_school s 
+		where s.code=#{schoolCode}
+	</select>
+	
 	<select id="getSchoolId" resultType="int">
 		select s.id
 		from b_school s