Explorar o código

伊宁项目更改相关 license代码相关

1037015548@qq.com hai 1 ano
pai
achega
be9e3ed670

+ 6 - 6
ruoyi-admin/src/main/resources/application-test.yml

@@ -53,12 +53,12 @@ spring:
                 # 主库数据源 stringtype=unspecified 如果stringtype设置为 unspecified,参数将作为非类型值发送到服务器,并且服务器将尝试推断适当的类型。
                 master:
 #                     url: jdbc:postgresql://119.96.165.176:5432/test_lixing?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
-                     url: jdbc:postgresql://119.96.165.176:5432/lhk_union_mgr_new?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
-                     username: postgres
-                     password: kpr.23417.postgres
-#                      url: jdbc:postgresql://140.246.183.164:5432/union_mgr?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
-#                      username: postgres
-#                      password: kpr.23417.postgres
+#                     url: jdbc:postgresql://119.96.165.176:5432/lhk_union_mgr_new?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
+#                     username: postgres
+#                     password: kpr.23417.postgres
+                      url: jdbc:postgresql://140.246.183.164:5432/union_mgr?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
+                      username: postgres
+                      password: kpr.23417.postgres
                 # 从库数据源
                 slave:
                     # 从数据源开关/默认关闭

BIN=BIN
ruoyi-framework/libs/gbase.1.0.1.jar


BIN=BIN
ruoyi-framework/license/LicenseMgr.res


+ 11 - 1
ruoyi-framework/pom.xml

@@ -78,5 +78,15 @@
         </dependency>
 
     </dependencies>
-
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/license</directory>
+                <targetPath>BOOT-INF/license/</targetPath>
+                <includes>
+                    <include>**/*.res</include>
+                </includes>
+            </resource>
+        </resources>
+    </build>
 </project>

+ 81 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/license/CommTool.java

@@ -0,0 +1,81 @@
+package com.ruoyi.framework.config.license;
+
+import java.io.*;
+
+/**
+ * @ClassName CommTool
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/22
+ * @Version V1.0
+ **/
+public class CommTool {
+    public static String readFile(String filePath){
+        InputStream in = null;
+        try{
+            in = new FileInputStream(filePath);
+            byte[] bytes = new byte[in.available()];
+            in.read(bytes);
+            return new String(bytes);
+        }catch(Exception e){
+        }finally {
+            try {
+                if (in != null)
+                    in.close();
+            }catch (Exception e){}
+        }
+        return "";
+    }
+    public static byte[] deCipherClass(String srcPath) {
+        File file = new File(srcPath);
+        if (!file.exists())
+            return null;
+
+        BufferedInputStream in = null;
+        ByteArrayOutputStream out = null;
+        try {
+            in = new BufferedInputStream(new FileInputStream(file));
+            out = new ByteArrayOutputStream();
+            int data = 0;
+            while ((data = in.read()) != -1) {
+                out.write(data ^ 0xFF);
+            }
+            out.flush();
+            return out.toByteArray();
+        }catch (Exception e){}
+        finally {
+            try {
+                if (in != null)
+                    in.close();
+                if (out != null)
+                    out.close();
+            }catch (Exception e1){}
+        }
+        return null;
+    }
+    public static byte[] deCipherClass(InputStream fileStream) {
+        if (fileStream == null)
+            return null;
+        BufferedInputStream in = null;
+        ByteArrayOutputStream out = null;
+        try {
+            in = new BufferedInputStream(fileStream);
+            out = new ByteArrayOutputStream();
+            int data = 0;
+            while ((data = in.read()) != -1) {
+                out.write(data ^ 0xFF);
+            }
+            out.flush();
+            return out.toByteArray();
+        }catch (Exception e){}
+        finally {
+            try {
+                if (in != null)
+                    in.close();
+                if (out != null)
+                    out.close();
+            }catch (Exception e1){}
+        }
+        return null;
+    }
+}

+ 93 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/license/GlobalData.java

@@ -0,0 +1,93 @@
+package com.ruoyi.framework.config.license;
+
+import com.global.base.tools.AESUtil;
+import com.global.base.tools.FastJsonUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+/**
+ * @ClassName GlobalData
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/22
+ * @Version V1.0
+ **/
+public class GlobalData {
+    private volatile boolean mBLicenseSwitch = false;      //license验证开关,对***.jar所在目录下的license.origin文件进行验证
+    private Method licenseInit = null, licenseCheck = null, licenseGetKey = null;
+    private String licenseOrigin = "";
+    private volatile boolean mBSwitchTraceLog = true;       //是否开启基于TraceId的日志记录
+    public static final Logger ACCESS_LOG = LoggerFactory.getLogger("sys-access");
+    private static volatile GlobalData msInstance = null;
+    public static GlobalData getInstance(){
+        if (msInstance == null){
+            synchronized (GlobalData.class){
+                if (msInstance == null)
+                    msInstance = new GlobalData();
+            }
+        }
+        return msInstance;
+    }
+
+    public void reInitLicense(){
+        if (!mBLicenseSwitch)
+            return;
+        if (licenseInit == null){
+            String[] licenseOriginElements = {System.getProperty("user.dir"), "license.origin"};
+            licenseOrigin = CommTool.readFile(String.join(File.separator, licenseOriginElements));
+            final InputStream licenseIn = this.getClass().getClassLoader().getResourceAsStream("BOOT-INF/license/LicenseMgr.res");
+            try {
+                Class licenseClass = new MyClassLoader(licenseIn).loadClass("com.global.base.licensemgr.LicenseMgr");
+                if (licenseClass != null){
+                    licenseInit = licenseClass.getMethod("reInit", new Class[]{Map.class});
+                    licenseGetKey = licenseClass.getMethod("getKey", new Class[]{});
+                    licenseCheck = licenseClass.getMethod("check", new Class[]{});
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+            if (licenseIn != null){
+                try {
+                    licenseIn.close();
+                }catch (Exception e){}
+            }
+        }
+
+        if (licenseInit != null){
+            try {
+                Map<String, String> licenseObj = null;
+                if (licenseGetKey != null){
+                    String tmp = AESUtil.AESDecrypt(AESUtil.Mode.CBC, AESUtil.Padding.PKCS5_PADDING, (String)licenseGetKey.invoke(null), licenseOrigin);
+                    licenseObj = FastJsonUtil.fromJSON2Map(tmp, String.class, String.class);
+                }
+                licenseInit.invoke(null, licenseObj);
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+
+            ACCESS_LOG.info(String.format("License Check Result {%s}", checkLicense()?"True":"False"));
+        }
+    }
+
+    public boolean checkLicense(){
+        if (!mBLicenseSwitch)
+            return true;
+        if (licenseCheck != null){
+            try {
+                return (Boolean)licenseCheck.invoke(null);
+            }catch (Exception e){}
+        }
+        return false;
+    }
+
+    public boolean isSwitchTraceLog() { return mBSwitchTraceLog; }
+
+    public void setLicenseSwitch(boolean mBLicenseSwitch) {
+        this.mBLicenseSwitch = mBLicenseSwitch;
+    }
+}

+ 32 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/license/MyClassLoader.java

@@ -0,0 +1,32 @@
+package com.ruoyi.framework.config.license;
+
+import java.io.InputStream;
+
+public class MyClassLoader extends ClassLoader {
+    private String classPath = "";
+    private InputStream classIn = null;
+
+    public MyClassLoader() {
+    }
+
+    public MyClassLoader(String classPath) {
+        this.classPath = classPath;
+    }
+
+    public MyClassLoader(InputStream classIn) {
+        this.classIn = classIn;
+    }
+
+    @Override
+    protected Class<?> findClass(String className) throws ClassNotFoundException {
+        //String baseName = className.substring(className.lastIndexOf('.') + 1);
+        try {
+            byte[] data = classIn==null? CommTool.deCipherClass(classPath):CommTool.deCipherClass(classIn);
+            Class<?> clz = defineClass(className, data, 0, data.length);
+            return clz;
+        }catch (Exception e){}
+        return super.findClass(className);
+    }
+}
+
+

+ 132 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/license/ScheduleTaskMgr.java

@@ -0,0 +1,132 @@
+package com.ruoyi.framework.config.license;
+
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * @ClassName ScheduleTaskMgr
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/22
+ * @Version V1.0
+ **/
+@Component
+@EnableScheduling   // 1.开启定时任务
+@EnableAsync        // 2.开启多线程
+public class ScheduleTaskMgr {
+    public static volatile long UTC_MS_TODAY_BEGIN = 0L;
+    public static volatile long UTC_MS_TODAY_END = 0L;
+    public static volatile long UTC_MS_THIS_MONTH_BEGIN = 0L;
+    public static volatile long UTC_MS_THIS_MONTH_END = 0L;
+    public static void refreshUTCTimeRes(){
+        UTC_MS_TODAY_BEGIN = getTodayBeginUTC();
+        UTC_MS_TODAY_END = getTodayEndUTC();
+        UTC_MS_THIS_MONTH_BEGIN = getMonthBeginUTC(System.currentTimeMillis());
+        UTC_MS_THIS_MONTH_END = getMonthEndUTC(System.currentTimeMillis());
+    }
+    /**
+     * 获取当天的开始时间
+     * @return UTC时间格式(单位:毫秒)
+     * 返回时间格式为:00:00:00.000所对应的时间戳
+     */
+    public static long getTodayBeginUTC(){
+        return LocalDateTime.of(LocalDate.now(), LocalTime.MIN)
+                .atZone(ZoneId.systemDefault())
+                .toInstant()
+                .toEpochMilli();
+        /*Calendar todayStart = Calendar.getInstance();
+        todayStart.set(Calendar.HOUR_OF_DAY, 0);
+        todayStart.set(Calendar.MINUTE, 0);
+        todayStart.set(Calendar.SECOND, 0);
+        todayStart.set(Calendar.MILLISECOND, 0);
+        return todayStart.getTime().getTime();*/
+    }
+    /**
+     * 获取当天的结束时间
+     * @return UTC时间格式(单位:毫秒)
+     * 返回时间格式为:23:59:59.999所对应的时间戳
+     */
+    public static long getTodayEndUTC(){
+        return LocalDateTime.of(LocalDate.now(), LocalTime.MAX)
+                .atZone(ZoneId.systemDefault())
+                .toInstant()
+                .toEpochMilli();
+        /*Calendar todayStart = Calendar.getInstance();
+        todayStart.set(Calendar.HOUR_OF_DAY, 23);
+        todayStart.set(Calendar.MINUTE, 59);
+        todayStart.set(Calendar.SECOND, 59);
+        todayStart.set(Calendar.MILLISECOND, 999);
+        return todayStart.getTime().getTime();*/
+    }
+    /**
+     * 获取当前时间所在月份的开始时间戳
+     * @param curTime
+     * @return UTC时间格式(单位:毫秒)
+     * 返回时间格式为:xxxx-xx-01 00:00:00.000所对应的时间戳
+     */
+    public static long getMonthBeginUTC(long curTime){
+        Calendar c = Calendar.getInstance();
+        if (!isMsUTC(curTime))
+            curTime = curTime*1000;
+        try {
+            c.setTime(new Date(curTime));
+            c.set(Calendar.DAY_OF_MONTH, 1);
+            c.set(Calendar.HOUR_OF_DAY, 0);
+            c.set(Calendar.MINUTE, 0);
+            c.set(Calendar.SECOND,0);
+            c.set(Calendar.MILLISECOND, 0);
+            return c.getTimeInMillis();
+        }catch (Exception e){}
+        return 0L;
+    }
+    /**
+     * 获取当前时间所在月份的结束时间戳
+     * @param curTime
+     * @return UTC时间格式(单位:毫秒)
+     * 返回时间格式为:xxxx-xx-31 23:59:59.999所对应的时间戳
+     */
+    public static long getMonthEndUTC(long curTime){
+        Calendar c = Calendar.getInstance();
+        if (!isMsUTC(curTime))
+            curTime = curTime*1000;
+        try {
+            c.setTime(new Date(curTime));
+            c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
+            c.set(Calendar.HOUR_OF_DAY, 23);
+            c.set(Calendar.MINUTE, 59);
+            c.set(Calendar.SECOND,59);
+            c.set(Calendar.MILLISECOND, 999);
+            return c.getTimeInMillis();
+        }catch (Exception e){}
+        return 0L;
+    }
+    /**
+     * 指定UTC是否为精确到毫秒的UTC时间
+     * @param lUTC
+     * @return
+     */
+    public static boolean isMsUTC(long lUTC){
+        return lUTC > 10000000000L;
+    }
+
+
+    @Scheduled(cron = "0 0-5 0 * * ?")
+    public void taskRefreshTimeRes() {
+        refreshUTCTimeRes();
+        ThreadTaskMgr.runTask(new Runnable() {
+            @Override
+            public void run() {
+                GlobalData.getInstance().reInitLicense();
+            }
+        });
+    }
+}

+ 45 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/license/ThreadTaskMgr.java

@@ -0,0 +1,45 @@
+package com.ruoyi.framework.config.license;
+
+import com.global.base.thread.ThreadPoolProxy;
+
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+public class ThreadTaskMgr {
+    public static void initThreadResource(){
+        ThreadPoolProxy.getInstance().initFixedPoolRes("COMM",100, "COMM");
+    }
+
+    public static void runTask(final Runnable command){
+        if (command == null)
+            return;
+        ThreadPoolProxy.getInstance().getFixedThreadPool("COMM").execute(command);
+    }
+
+    public static <V> FutureTask<V> runTask(final TraceCallable<V> callable){
+        FutureTask<V> futureTask = new FutureTask<>(callable);
+        ThreadPoolProxy.getInstance().getFixedThreadPool("COMM").execute(futureTask);
+        return futureTask;
+    }
+
+    public static <T> T getFutureRes(FutureTask<T> futureTask){
+        if (futureTask == null)
+            return null;
+        try {
+            return futureTask.get();
+        }catch (Exception e){}
+        return null;
+    }
+
+    public static <T> T getFutureRes(FutureTask<T> futureTask, long timeout, TimeUnit unit){
+        if (futureTask == null)
+            return null;
+        try {
+            return futureTask.get(timeout, unit);
+        }catch (TimeoutException et){
+        }catch (Exception e){
+        }
+        return null;
+    }
+}

+ 29 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/license/TraceCallable.java

@@ -0,0 +1,29 @@
+package com.ruoyi.framework.config.license;
+
+
+import java.util.concurrent.Callable;
+
+public abstract class TraceCallable<V> implements Callable<V> {
+
+    private String strTraceId = "";
+
+    public TraceCallable(String traceId) { this.strTraceId = traceId; }
+
+    private void prePost(){ TraceLogMgr.setTraceId(strTraceId); }
+
+    private void afterPost(){ TraceLogMgr.removeTraceId(); }
+
+    public abstract V function() throws Exception;
+
+    @Override
+    final public V call() throws Exception {
+        prePost();
+        try {
+            return function();
+        }catch (Exception ex){
+            throw ex;
+        }finally {
+            afterPost();
+        }
+    }
+}

+ 26 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/license/TraceLogMgr.java

@@ -0,0 +1,26 @@
+package com.ruoyi.framework.config.license;
+
+import com.global.base.tools.TraceIdUtil;
+
+public class TraceLogMgr {
+    public static void setTraceId(String traceId){
+        if (GlobalData.getInstance().isSwitchTraceLog())
+            TraceIdUtil.setTraceId(traceId);
+    }
+    public static void setTraceIdByBusinessType(String strBusinessType){
+        if (GlobalData.getInstance().isSwitchTraceLog())
+            TraceIdUtil.setTraceIdByBusinessType(strBusinessType);
+    }
+
+    public static String getTraceId(){
+        if (GlobalData.getInstance().isSwitchTraceLog())
+            return TraceIdUtil.getTraceId();
+        return "TID-0";
+    }
+
+    public static String removeTraceId(){
+        if (GlobalData.getInstance().isSwitchTraceLog())
+            return TraceIdUtil.removeTraceId();
+        return "TID-0";
+    }
+}

+ 8 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java

@@ -2,6 +2,8 @@ package com.ruoyi.framework.shiro.realm;
 
 import java.util.HashSet;
 import java.util.Set;
+
+import com.ruoyi.framework.config.license.GlobalData;
 import org.apache.shiro.authc.AuthenticationException;
 import org.apache.shiro.authc.AuthenticationInfo;
 import org.apache.shiro.authc.AuthenticationToken;
@@ -86,6 +88,12 @@ public class UserRealm extends AuthorizingRealm
     @Override
     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException
     {
+        //TODO license验证
+        if (!GlobalData.getInstance().checkLicense()){
+            throw new AuthenticationException("license error");
+        }
+
+        //TODO 登录认证
         UsernamePasswordToken upToken = (UsernamePasswordToken) token;
         String username = upToken.getUsername();
         String password = "";