refactor(license): 优化 license 模块

This commit is contained in:
jasmine
2025-04-17 06:29:34 +00:00
committed by Charles7c
parent da4c8154bf
commit 1ce5c023cf
22 changed files with 345 additions and 306 deletions

View File

@@ -276,6 +276,18 @@
<artifactId>continew-starter-core</artifactId> <artifactId>continew-starter-core</artifactId>
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<!-- license 生成模块 -->
<dependency>
<groupId>top.continew</groupId>
<artifactId>continew-starter-license-generate</artifactId>
<version>${revision}</version>
</dependency>
<!-- license 校验模块 -->
<dependency>
<groupId>top.continew</groupId>
<artifactId>continew-starter-license-verify</artifactId>
<version>${revision}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>

View File

@@ -139,6 +139,21 @@ public class PropertiesConstants {
*/ */
public static final String TRACE = CONTINEW_STARTER + StringConstants.DOT + "trace"; public static final String TRACE = CONTINEW_STARTER + StringConstants.DOT + "trace";
/**
* license配置
*/
public static final String LICENSE = CONTINEW_STARTER + StringConstants.DOT + "license";
/**
* license 生成模块配置
*/
public static final String LICENSE_GENERATE = LICENSE + StringConstants.DOT + "generate";
/**
* license 校验模块配置
*/
public static final String LICENSE_VERIFY = LICENSE + StringConstants.DOT + "verify";
private PropertiesConstants() { private PropertiesConstants() {
} }
} }

View File

@@ -48,6 +48,10 @@
<commons-beanutils.version>1.9.4</commons-beanutils.version> <commons-beanutils.version>1.9.4</commons-beanutils.version>
<commons-io.version>2.17.0</commons-io.version> <commons-io.version>2.17.0</commons-io.version>
<commons-compress.version>1.26.0</commons-compress.version> <commons-compress.version>1.26.0</commons-compress.version>
<!--license-->
<truelicense.version>1.33</truelicense.version>
<zip4j.version>2.11.5</zip4j.version>
<!-- Maven Plugin Versions --> <!-- Maven Plugin Versions -->
<flatten.version>1.7.0</flatten.version> <flatten.version>1.7.0</flatten.version>
<spotless.version>2.44.3</spotless.version> <spotless.version>2.44.3</spotless.version>
@@ -370,6 +374,20 @@
<version>${commons-compress.version}</version> <version>${commons-compress.version}</version>
</dependency> </dependency>
<!-- license 依赖-->
<dependency>
<groupId>de.schlichtherle.truelicense</groupId>
<artifactId>truelicense-core</artifactId>
<version>${truelicense.version}</version>
</dependency>
<!--zip4j压缩文件-->
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>${zip4j.version}</version>
</dependency>
<!-- ContiNew Starter 依赖 --> <!-- ContiNew Starter 依赖 -->
<dependency> <dependency>
<groupId>top.continew</groupId> <groupId>top.continew</groupId>

View File

@@ -1,4 +1,4 @@
## continew-starter-license-generate 用方法 ## continew-starter-license-generate 使用方法
1. 引入依赖 1. 引入依赖
@@ -66,7 +66,8 @@ public class LicenseGenerateController {
paramVO.setStorePass("123456a"); paramVO.setStorePass("123456a");
//设置过期时间 //设置过期时间
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
long expire = new Date().getTime() + (24L * 3600L * 1000L); long expire = Instant.now().toEpochMilli() + (24L * 3600L * 1000L);;
// long expire = new Date().getTime() + (24L * 3600L * 1000L);
calendar.setTimeInMillis(expire); calendar.setTimeInMillis(expire);
paramVO.setExpireTime(calendar.getTime()); paramVO.setExpireTime(calendar.getTime());
//设置额外校验参数(服务器信息) //设置额外校验参数(服务器信息)
@@ -78,7 +79,4 @@ public class LicenseGenerateController {
} }
``` ```
注:默认生成 license 为FileUtil.getTmpDirPath()下。将压缩包发送给客户端使用。
注:默认生成 license 为C:/license下。将压缩包发送给客户端使用。

View File

@@ -13,64 +13,23 @@
<packaging>jar</packaging> <packaging>jar</packaging>
<description>license 生成模块 基于 truelicens 实现</description> <description>license 生成模块 基于 truelicens 实现</description>
<properties>
<truelicense.version>1.33</truelicense.version>
<zip4j.version>2.2.6</zip4j.version>
</properties>
<dependencies> <dependencies>
<!--ContiNew Starter 日志模块 - 核心模块-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>top.continew</groupId> <groupId>top.continew</groupId>
<artifactId>continew-starter-log-core</artifactId> <artifactId>continew-starter-log-core</artifactId>
</dependency> </dependency>
<!-- license 依赖-->
<dependency> <dependency>
<groupId>de.schlichtherle.truelicense</groupId> <groupId>de.schlichtherle.truelicense</groupId>
<artifactId>truelicense-core</artifactId> <artifactId>truelicense-core</artifactId>
<version>${truelicense.version}</version>
</dependency> </dependency>
<!--zip4j压缩文件--> <!--zip4j压缩文件-->
<dependency> <dependency>
<groupId>net.lingala.zip4j</groupId> <groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId> <artifactId>zip4j</artifactId>
<version>${zip4j.version}</version>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<!--apache-commons-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -1,38 +0,0 @@
/*
* Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package top.continew.license.autoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import top.continew.license.service.LicenseCreateService;
/**
* @Desc:
* @Author loach
* @ClassName top.continew.license.AutoConfiguration.LicenseGenerateAutoConfiguration
* @Date 2025-03-23 10:57
*/
@Configuration
public class LicenseGenerateAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public LicenseCreateService licenseCreateService() {
return LicenseCreateService.getInstance();
}
}

View File

@@ -0,0 +1,57 @@
/*
* Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package top.continew.license.autoconfigure;
import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import top.continew.license.service.LicenseCreateService;
import top.continew.starter.core.constant.PropertiesConstants;
/**
* license 生成模块 自动配置
*
* @author loach
* @since 1.2.0
*/
@AutoConfiguration
@EnableConfigurationProperties(LicenseGenerateProperties.class)
@ConditionalOnProperty(prefix = PropertiesConstants.LICENSE_GENERATE, name = PropertiesConstants.ENABLED, havingValue = "true", matchIfMissing = true)
public class LicenseGenerateAutoConfiguration {
private static final Logger log = LoggerFactory.getLogger(LicenseGenerateAutoConfiguration.class);
/**
* license 生成服务接口
*/
@Bean
@ConditionalOnMissingBean
public LicenseCreateService licenseCreateService() {
return LicenseCreateService.getInstance();
}
@PostConstruct
public void postConstruct() {
log.debug("[ContiNew Starter] - Auto Configuration 'License-Generate' completed initialization.");
}
}

View File

@@ -14,27 +14,29 @@
* limitations under the License. * limitations under the License.
*/ */
package top.continew.license.config; package top.continew.license.autoconfigure;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import top.continew.starter.core.constant.PropertiesConstants;
/** /**
* @Desc: * license 生成模块配置属性
* @Author loach *
* @ClassName top.continew.license.config.LicenseYmlConfig * @author Jasmine
* @Date 2025-04-14 14:56 * @since 1.2.0
*/ */
@ConfigurationProperties(prefix = "license") @ConfigurationProperties(PropertiesConstants.LICENSE_GENERATE)
public class LicenseVerifyProperties { public class LicenseGenerateProperties {
/**
* 是否启用
*/
private boolean enabled = true;
private String savePath; public boolean isEnabled() {
return enabled;
public String getSavePath() {
return savePath;
} }
public void setSavePath(String savePath) { public void setEnabled(boolean enabled) {
this.savePath = savePath; this.enabled = enabled;
} }
} }

View File

@@ -16,12 +16,33 @@
package top.continew.license.service; package top.continew.license.service;
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File;
import de.schlichtherle.license.*; import java.io.FileOutputStream;
import net.lingala.zip4j.ZipFile; import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.prefs.Preferences;
import javax.security.auth.x500.X500Principal;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.schlichtherle.license.CipherParam;
import de.schlichtherle.license.DefaultCipherParam;
import de.schlichtherle.license.DefaultLicenseParam;
import de.schlichtherle.license.KeyStoreParam;
import de.schlichtherle.license.LicenseContent;
import de.schlichtherle.license.LicenseManager;
import de.schlichtherle.license.LicenseParam;
import net.lingala.zip4j.ZipFile;
import top.continew.license.dto.ConfigParam; import top.continew.license.dto.ConfigParam;
import top.continew.license.dto.LicenseCreatorParam; import top.continew.license.dto.LicenseCreatorParam;
import top.continew.license.dto.LicenseCreatorParamVO; import top.continew.license.dto.LicenseCreatorParamVO;
@@ -32,13 +53,6 @@ import top.continew.license.manager.ServerLicenseManager;
import top.continew.license.util.ExecCmdUtil; import top.continew.license.util.ExecCmdUtil;
import top.continew.license.util.ServerInfoUtils; import top.continew.license.util.ServerInfoUtils;
import javax.security.auth.x500.X500Principal;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
import java.util.prefs.Preferences;
/** /**
* 证书生成接口 实现类 * 证书生成接口 实现类
* *
@@ -114,7 +128,7 @@ public class LicenseCreateService {
String privateAlias = customerName + "-private-alias"; String privateAlias = customerName + "-private-alias";
String publicAlias = customerName + "-public-alias"; String publicAlias = customerName + "-public-alias";
String relativePath = relativePath(paramVO); String relativePath = relativePath(paramVO);
String currentCustomerDir = relativePath + customerName + uuid() + "/"; String currentCustomerDir = relativePath + customerName + uuid() + File.separator;
File file = new File(currentCustomerDir); File file = new File(currentCustomerDir);
if (!file.exists()) { if (!file.exists()) {
file.mkdirs(); file.mkdirs();

View File

@@ -16,13 +16,13 @@
package top.continew.license.util; package top.continew.license.util;
import org.apache.commons.lang3.ArrayUtils;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.LineNumberReader; import java.io.LineNumberReader;
import cn.hutool.core.util.ArrayUtil;
/** /**
* 运行命令行工具类 * 运行命令行工具类
* *
@@ -50,7 +50,7 @@ public class ExecCmdUtil {
process = Runtime.getRuntime().exec(cmd); process = Runtime.getRuntime().exec(cmd);
} }
} else { } else {
cmd = ArrayUtils.addAll(new String[] {"/bin/sh", "-c"}, cmd); cmd = ArrayUtil.addAll(new String[] {"/bin/sh", "-c"}, cmd);
process = Runtime.getRuntime().exec(cmd); process = Runtime.getRuntime().exec(cmd);
} }

View File

@@ -1 +1 @@
top.continew.license.autoConfiguration.LicenseGenerateAutoConfiguration top.continew.license.autoconfigure.LicenseGenerateAutoConfiguration

View File

@@ -13,10 +13,10 @@
2. 配置YMLlicense 压缩包存放位置) 2. 配置YMLlicense 压缩包存放位置)
```yaml ```yaml
continew-starter:
license: license:
savePath: D:/license/ verify:
storePath: D:/license
``` ```
注:默认加载 `FileUtil.getTmpDirPath()` 位置。
注:默认加载 `D:/license/` 位置。

View File

@@ -13,54 +13,23 @@
<packaging>jar</packaging> <packaging>jar</packaging>
<description>license 校验模块 基于 truelicens 实现</description> <description>license 校验模块 基于 truelicens 实现</description>
<properties>
<truelicense.version>1.33</truelicense.version>
<zip4j.version>2.2.6</zip4j.version>
</properties>
<dependencies> <dependencies>
<!--ContiNew Starter 日志模块 - 核心模块-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency> <dependency>
<groupId>top.continew</groupId> <groupId>top.continew</groupId>
<artifactId>continew-starter-log-core</artifactId> <artifactId>continew-starter-log-core</artifactId>
</dependency> </dependency>
<dependency> <!-- license 依赖-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency> <dependency>
<groupId>de.schlichtherle.truelicense</groupId> <groupId>de.schlichtherle.truelicense</groupId>
<artifactId>truelicense-core</artifactId> <artifactId>truelicense-core</artifactId>
<version>${truelicense.version}</version>
</dependency> </dependency>
<!--zip4j压缩文件--> <!--zip4j压缩文件-->
<dependency> <dependency>
<groupId>net.lingala.zip4j</groupId> <groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId> <artifactId>zip4j</artifactId>
<version>${zip4j.version}</version>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -17,31 +17,25 @@
package top.continew.license.Initializing; package top.continew.license.Initializing;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import top.continew.license.bean.LicenseInstallerBean; import top.continew.license.bean.LicenseInstallerBean;
/** /**
* 启动校验 License * 启动校验 License
* *
* @Desc: * @author loach
* @Author loach * @since 1.2.0
* @ClassName top.continew.license.Initializing.LicenseStarterAutoConfiguration
* @Date 2025-04-11 15:40
*/ */
@Configuration
@EnableConfigurationProperties(LicenseStarterInitializingBean.class)
public class LicenseStarterInitializingBean implements InitializingBean { public class LicenseStarterInitializingBean implements InitializingBean {
private final LicenseInstallerBean licenseInstallerBean;
@Autowired public LicenseStarterInitializingBean(LicenseInstallerBean licenseInstallerBean) {
private LicenseInstallerBean licenseInstallerBean; this.licenseInstallerBean = licenseInstallerBean;
}
@Override @Override
public void afterPropertiesSet() throws Exception { public void afterPropertiesSet() throws Exception {
// 安装证书,即校验客户机器参数是否符合证书要求,符合则安装成功,不符合则报错无法启动。 // 安装证书,即校验客户机器参数是否符合证书要求,符合则安装成功,不符合则报错无法启动。
licenseInstallerBean.installLicense(); licenseInstallerBean.installLicense();
} }
} }

View File

@@ -0,0 +1,73 @@
/*
* Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package top.continew.license.autoconfigure;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.DependsOn;
import de.schlichtherle.license.LicenseManager;
import jakarta.annotation.PostConstruct;
import top.continew.license.Initializing.LicenseStarterInitializingBean;
import top.continew.license.bean.LicenseInstallerBean;
import top.continew.license.manager.CustomLicenseManager;
import top.continew.starter.core.constant.PropertiesConstants;
/**
* license 校验模块 自动配置
*
* @author loach
* @since 1.2.0
*/
@AutoConfiguration
@EnableConfigurationProperties(LicenseVerifyProperties.class)
@ConditionalOnProperty(prefix = PropertiesConstants.LICENSE_VERIFY, name = PropertiesConstants.ENABLED, havingValue = "true", matchIfMissing = true)
public class LicenseVerifyAutoConfiguration {
private static final Logger log = LoggerFactory.getLogger(LicenseVerifyAutoConfiguration.class);
/** 证书安装业务类 */
@Bean
public LicenseInstallerBean licenseInstallerBean(LicenseVerifyProperties properties) {
return new LicenseInstallerBean(properties);
}
/**
* 启动校验 License服务
*/
@Bean
@DependsOn("licenseInstallerBean")
public LicenseStarterInitializingBean licenseStarterInitializingBean(LicenseInstallerBean licenseInstallerBean) {
return new LicenseStarterInitializingBean(licenseInstallerBean);
}
/** 客户端证书管理类(证书验证) */
@Bean
public LicenseManager licenseManager(LicenseVerifyProperties properties) {
return CustomLicenseManager.getInstance(properties);
}
@PostConstruct
public void postConstruct() {
log.debug("[ContiNew Starter] - Auto Configuration 'License-Verify' completed initialization.");
}
}

View File

@@ -0,0 +1,58 @@
/*
* Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package top.continew.license.autoconfigure;
import org.springframework.boot.context.properties.ConfigurationProperties;
import cn.hutool.core.io.FileUtil;
import top.continew.starter.core.constant.PropertiesConstants;
/**
* license 校验模块配置属性
*
* @author loach
* @since 1.2.0
*/
@ConfigurationProperties(PropertiesConstants.LICENSE_VERIFY)
public class LicenseVerifyProperties {
/**
* 是否启用
*/
private boolean enabled = true;
/**
* 生成的license文件所在路径
*/
private String storePath = FileUtil.getTmpDirPath();
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public String getStorePath() {
return storePath;
}
public void setStorePath(String storePath) {
this.storePath = storePath;
}
}

View File

@@ -19,7 +19,7 @@ package top.continew.license.bean;
import de.schlichtherle.license.*; import de.schlichtherle.license.*;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import top.continew.license.config.LicenseVerifyProperties; import top.continew.license.autoconfigure.LicenseVerifyProperties;
import top.continew.license.exception.VerifyException; import top.continew.license.exception.VerifyException;
import top.continew.license.manager.CustomLicenseManager; import top.continew.license.manager.CustomLicenseManager;
@@ -28,45 +28,28 @@ import java.io.*;
/** /**
* 证书安装业务类 * 证书安装业务类
* *
* @Desc: * @author loach
* @Author loach * @since 1.2.0
* @ClassName top.continew.license.bean.LicenseInstallerBean
* @Date 2025-04-15 15:05
*/ */
public class LicenseInstallerBean { public class LicenseInstallerBean {
private static final Logger log = LoggerFactory.getLogger(LicenseInstallerBean.class); private static final Logger log = LoggerFactory.getLogger(LicenseInstallerBean.class);
private String licensePath;
private LicenseManager licenseManager; private LicenseManager licenseManager;
private LicenseVerifyProperties properties; private LicenseVerifyProperties properties;
public LicenseInstallerBean(LicenseVerifyProperties properties) { public LicenseInstallerBean(LicenseVerifyProperties properties) {
this.properties = properties; this.properties = properties;
if (properties == null || properties.getSavePath() == null) {
String os = System.getProperty("os.name");
if (os.toLowerCase().contains("windows")) {
this.licensePath = "D:/license/";
}
this.licensePath = "/data/license/";
} else {
this.licensePath = properties.getSavePath();
}
} }
// 安装证书 // 安装证书
public void installLicense() throws Exception { public void installLicense() throws Exception {
try { try {
licenseManager = CustomLicenseManager.getInstance(properties); licenseManager = CustomLicenseManager.getInstance(properties);
licenseManager.uninstall(); licenseManager.uninstall();
LicenseContent licenseContent = licenseManager LicenseContent licenseContent = licenseManager.install(new File(properties
.install(new File(getLicensePath() + "clientLicense/license.lic")); .getStorePath() + File.separator + "clientLicense/license.lic"));
log.info("证书认证通过,安装成功"); log.info("证书认证通过,安装成功");
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@@ -92,13 +75,4 @@ public class LicenseInstallerBean {
throw new VerifyException("证书认证失败:licenseManager is null"); throw new VerifyException("证书认证失败:licenseManager is null");
} }
/**
* 获取license文件位置
*
* @return
*/
private String getLicensePath() {
return licensePath;
}
} }

View File

@@ -1,51 +0,0 @@
/*
* Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package top.continew.license.config;
import de.schlichtherle.license.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import top.continew.license.bean.LicenseInstallerBean;
import top.continew.license.manager.CustomLicenseManager;
/**
* @Desc:
* @Author loach
* @ClassName top.continew.license.config.LicenseAutoConfiguration
* @Date 2025-04-15 15:17
*/
@Configuration
public class LicenseAutoConfiguration {
private String licensePath;
@Bean
public LicenseVerifyProperties licenseVerifyProperties() {
return new LicenseVerifyProperties();
}
@Bean
public LicenseInstallerBean licenseInstallerBean(LicenseVerifyProperties properties) {
return new LicenseInstallerBean(properties);
}
@Bean
public LicenseManager licenseManager(LicenseVerifyProperties properties) {
return CustomLicenseManager.getInstance(properties);
}
}

View File

@@ -25,7 +25,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import top.continew.license.bean.LicenseInstallerBean; import top.continew.license.bean.LicenseInstallerBean;
import top.continew.license.config.LicenseVerifyProperties; import top.continew.license.autoconfigure.LicenseVerifyProperties;
import top.continew.license.dto.ConfigParam; import top.continew.license.dto.ConfigParam;
import top.continew.license.dto.LicenseExtraModel; import top.continew.license.dto.LicenseExtraModel;
import top.continew.license.keyStoreParam.CustomKeyStoreParam; import top.continew.license.keyStoreParam.CustomKeyStoreParam;
@@ -37,10 +37,8 @@ import java.util.prefs.Preferences;
/** /**
* 客户端证书管理类(证书验证) * 客户端证书管理类(证书验证)
* *
* @Desc: * @author loach
* @Author loach * @since 1.2.0
* @ClassName top.continew.license.manager.ClientLicenseManager
* @Date 2025-04-11 15:00
*/ */
@Component @Component
public class CustomLicenseManager extends LicenseManager { public class CustomLicenseManager extends LicenseManager {
@@ -50,6 +48,28 @@ public class CustomLicenseManager extends LicenseManager {
private static volatile CustomLicenseManager INSTANCE; private static volatile CustomLicenseManager INSTANCE;
private LicenseExtraModel extraModel; private LicenseExtraModel extraModel;
private LicenseVerifyProperties properties;
private CustomLicenseManager(LicenseVerifyProperties properties) {
this.properties = properties;
// 初始化服务信息
initServerExtraModel();
// 解压证书和配置文件等
extractZip();
// 获取配置文件
ConfigParam configParam = getConfigParam();
// 安装证书
Preferences preferences = Preferences.userNodeForPackage(LicenseInstallerBean.class);
CipherParam cipherParam = new DefaultCipherParam(configParam.getStorePass());
KeyStoreParam publicKeyStoreParam = new CustomKeyStoreParam(LicenseInstallerBean.class, properties
.getStorePath() + File.separator + "clientLicense/publicCerts.keystore", configParam
.getPublicAlias(), configParam.getStorePass(), null);
LicenseParam licenseParam = new DefaultLicenseParam(configParam
.getSubject(), preferences, publicKeyStoreParam, cipherParam);
super.setLicenseParam(licenseParam);
}
public static CustomLicenseManager getInstance(LicenseVerifyProperties properties) { public static CustomLicenseManager getInstance(LicenseVerifyProperties properties) {
if (INSTANCE == null) { if (INSTANCE == null) {
synchronized (CustomLicenseManager.class) { synchronized (CustomLicenseManager.class) {
@@ -61,36 +81,6 @@ public class CustomLicenseManager extends LicenseManager {
return INSTANCE; return INSTANCE;
} }
private String licensePath;
public CustomLicenseManager(LicenseVerifyProperties properties) {
if (properties == null || properties.getSavePath() == null) {
String os = System.getProperty("os.name");
if (os.toLowerCase().contains("windows")) {
this.licensePath = "D:/license/";
}
this.licensePath = "/data/license/";
} else {
this.licensePath = properties.getSavePath();
}
//初始化服务信息
initServerExtraModel();
//解压证书和配置文件等
extractZip();
//获取配置文件
ConfigParam configParam = getConfigParam();
//安装证书
Preferences preferences = Preferences.userNodeForPackage(LicenseInstallerBean.class);
CipherParam cipherParam = new DefaultCipherParam(configParam.getStorePass());
KeyStoreParam publicKeyStoreParam = new CustomKeyStoreParam(LicenseInstallerBean.class, getLicensePath() + "clientLicense/publicCerts.keystore", configParam
.getPublicAlias(), configParam.getStorePass(), null);
LicenseParam licenseParam = new DefaultLicenseParam(configParam
.getSubject(), preferences, publicKeyStoreParam, cipherParam);
super.setLicenseParam(licenseParam);
}
private void initServerExtraModel() { private void initServerExtraModel() {
this.extraModel = ServerInfoUtils.getServerInfos(); this.extraModel = ServerInfoUtils.getServerInfos();
} }
@@ -101,8 +91,8 @@ public class CustomLicenseManager extends LicenseManager {
* @throws ZipException * @throws ZipException
*/ */
private void extractZip() { private void extractZip() {
ZipFile config = new ZipFile(getLicensePath() + "clientLicense.zip"); ZipFile config = new ZipFile(properties.getStorePath() + File.separator + "clientLicense.zip");
File licenseDir = new File(getLicensePath() + "clientLicense"); File licenseDir = new File(properties.getStorePath() + File.separator + "clientLicense");
if (!licenseDir.exists()) { if (!licenseDir.exists()) {
licenseDir.mkdir(); licenseDir.mkdir();
} }
@@ -124,7 +114,8 @@ public class CustomLicenseManager extends LicenseManager {
FileInputStream config = null; FileInputStream config = null;
BufferedReader reader = null; BufferedReader reader = null;
try { try {
config = new FileInputStream(getLicensePath() + "clientLicense/clientConfig.json"); config = new FileInputStream(properties
.getStorePath() + File.separator + "clientLicense/clientConfig.json");
reader = new BufferedReader(new InputStreamReader(config, "UTF-8")); reader = new BufferedReader(new InputStreamReader(config, "UTF-8"));
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
String temp = null; String temp = null;
@@ -155,15 +146,6 @@ public class CustomLicenseManager extends LicenseManager {
return null; return null;
} }
/**
* 获取license文件位置
*
* @return
*/
private String getLicensePath() {
return this.licensePath;
}
/** /**
* 重写验证证书方法,添加自定义参数验证 * 重写验证证书方法,添加自定义参数验证
*/ */

View File

@@ -1,2 +1 @@
top.continew.license.config.LicenseAutoConfiguration top.continew.license.autoconfigure.LicenseVerifyAutoConfiguration
top.continew.license.Initializing.LicenseStarterInitializingBean

View File

@@ -17,5 +17,11 @@
<module>continew-starter-license-verify</module> <module>continew-starter-license-verify</module>
</modules> </modules>
<dependencies>
<!-- 核心模块 -->
<dependency>
<groupId>top.continew</groupId>
<artifactId>continew-starter-core</artifactId>
</dependency>
</dependencies>
</project> </project>