SpringBoot实现 License 认证(只校验有效期)

文摘   2024-11-10 10:01   山西  
嗨,大家好,今天咱们聊聊“如何用 SpringBoot 实现 License 认证”,不过呢,咱只验证有效期。
说别的,作为程序员的日常工具,我们的代码有时候也得上点锁,防止“别有用心”的小伙伴们免费蹭用。这种 License 认证呢,尤其是在项目商用化时显得特别重要。今天就带大家一起看看具体实现的套路!
首先大致捋一捋流程,不然直接上代码,大家可能会一脸懵,毕竟授权逻辑还是要理清的。

1. License 认证:这玩意儿是干啥的?

License 是咱们常见的“许可证”或“授权文件”,大概可以理解成一个数字签名的钥匙串,用来控制应用程序的使用权限。举个简单的例子,咱们下载了个付费软件,点开后,系统一般会让你输入个 License,这个 License 就是对软件使用权限的授权,它帮我们控制软件能用到啥时候。
对于企业来说,License 管理一般包括以下两个点:
  1. 有效期:这个 License 什么时候到期,控制软件的使用时长。
  2. 硬件绑定:比如限制只能在指定服务器上运行,避免拷贝到其他设备上乱用。
咱们今天就专注在第一个,也就是校验 License 的有效期。

2. 开始搞密钥:授权者生成密钥对

要搞 License,首先需要一个密钥对(公钥和私钥),授权方和使用方之间得有个“你知我知”的安全链。这里授权者是生成 License 的一方,我们作为使用者需要进行验证。
生成密钥对这一步通常可以用keytool命令行工具来完成,但为了方便,也可以在代码里实现生成。
# 生成密钥库,别忘了 -alias 参数指定别名
keytool -genkey -alias licenseKey -keyalg RSA -keystore privateKeys.keystore -keysize 2048 -validity 3650
这条命令会生成一个私钥库文件 privateKeys.keystore,保存到本地就行。这个密钥库中包含一个私钥,用于生成 License 证书。接下来导出公钥,这样使用者就可以用它来验证证书的合法性。
# 导出公钥
keytool -export -alias licenseKey -keystore privateKeys.keystore -file publicCert.cer
导出的公钥 publicCert.cer 会提供给使用方,用于在验证时进行“解密”操作,判断 License 的合法性。

3. 生成 License 证书

密钥搞定后,咱们要生成 License 文件,这其实是整个 License 管理中最关键的一步。Spring Boot 里我们可以引入 java-license-manager 或类似的依赖来生成 License。先加上 Maven 依赖:
<dependency>
    <groupId>com.github.java-license-manager</groupId>
    <artifactId>license-manager</artifactId>
    <version>1.0.0</version>
</dependency>
然后写一个 License 生成类,里面设置证书的各项参数,比如有效期、授权者信息等。一般来说,License 文件中需要包括以下内容:
  • 签发日期:什么时候签的
  • 到期日期:有效期到什么时候
  • 描述信息:如公司名、授权的设备 ID 等(我们今天只讲有效期验证,可以不加)
示例代码如下:
public class LicenseGenerator {
    public void generateLicense() {
        // 设置参数
        LicenseParam licenseParam = new LicenseParam();
        licenseParam.setSubject("software-license");
        licenseParam.setIssued(new Date());
        licenseParam.setNotAfter(new Date(System.currentTimeMillis() + 365L * 24 * 60 * 60 * 1000)); // 一年有效期
        // 设置密钥库
        KeyStoreParam keyStoreParam = new KeyStoreParam();
        keyStoreParam.setKeyStorePath("path/to/privateKeys.keystore");
        keyStoreParam.setAlias("licenseKey");
        keyStoreParam.setPassword("your-keystore-password");
        
        // 创建 License
        LicenseManager licenseManager = new LicenseManager(licenseParam, keyStoreParam);
        licenseManager.createLicense("path/to/license.lic");
        System.out.println("License 文件生成成功!");
    }
}
代码里通过KeyStoreParam指定了密钥库路径、别名、和密码等,用于生成合法的 License 文件,生成后会输出到指定路径,比如 license.lic

4. 使用方配置:License 验证

接下来是验证 License 的操作啦,这一部分就到我们使用方了。使用方需要在项目启动时验证这个 License 是否有效,而且一般需要一个拦截器,防止未经授权的请求通过。
同样,我们先引入 license-manager 依赖,然后编写 License 验证类:
public class LicenseValidator {
    public boolean validateLicense() {
        try {
            LicenseParam licenseParam = new LicenseParam();
            licenseParam.setSubject("software-license");
            KeyStoreParam publicKeyStoreParam = new KeyStoreParam();
            publicKeyStoreParam.setKeyStorePath("path/to/publicCert.cer");
            
            LicenseManager licenseManager = new LicenseManager(licenseParam, publicKeyStoreParam);
            LicenseContent licenseContent = licenseManager.verifyLicense("path/to/license.lic");
            // 验证 License 是否在有效期内
            Date now = new Date();
            return now.before(licenseContent.getNotAfter());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}
在验证时,我们需要加载公钥库 publicCert.cer,用它去验证 license.lic 的合法性。通过 verifyLicense() 方法获取到的 LicenseContent,其中包含了 License 的详细内容,我们可以通过有效期字段进行检查。

5. 项目启动时安装证书

为了保证项目每次启动都能检查 License 的合法性,我们可以在 Spring Boot 的启动类中进行安装:
@SpringBootApplication
public class LicenseApplication implements CommandLineRunner {
    
    @Autowired
    private LicenseValidator licenseValidator;

    public static void main(String[] args) {
        SpringApplication.run(LicenseApplication.classargs);
    }

    @Override
    public void run(String... args) {
        if (!licenseValidator.validateLicense()) {
            System.out.println("License 无效或已过期,系统即将退出。");
            System.exit(1);
        } else {
            System.out.println("License 验证通过,启动系统。");
        }
    }
}
这样,程序在启动时会自动调用 validateLicense(),如果 License 无效,系统将直接退出。大伙儿一定要测试下,确保证书有效才能顺利启动系统。

6. 加个拦截器,再稳一手

我们可以在项目里添加一个拦截器,这样每次请求都能自动进行 License 校验。
@Component
public class LicenseInterceptor implements HandlerInterceptor {
    
    @Autowired
    private LicenseValidator licenseValidator;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (!licenseValidator.validateLicense()) {
            response.sendError(HttpStatus.FORBIDDEN.value(), "License 无效或已过期");
            return false;
        }
        return true;
    }
}
再将拦截器注册到 Spring MVC 配置中:
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LicenseInterceptor licenseInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(licenseInterceptor).addPathPatterns("/**");
    }
}
实现 License 认证的流程其实不复杂,只要搞清楚密钥对的生成、License 文件的生成以及验证机制,剩下的就是在项目中去配置验证类和拦截器。
加个 License 认证能有效控制应用程序的使用权限,特别是商用化应用中,防止被盗用真的是刚需。
所以,记住了,这种“锁”可千万别忘了上!

-END-

ok,今天先说到这,老规矩,看完文章记得右下角给何老师点赞,

最后送给大家一个福利,我这里有一份搞副业的教程,这份教程里有100+个搞钱小项目:

网盘拉新核心玩法、公众号运营变现、小红书虚拟资料引流等,现在扫码加我微信,即可领取这份副业教程。

添加时备注:副业

程序媛山楂
5年+程序媛,专注于AI编程普及。本号主要分享AI编程、Chat账号、Chat教程、Sora教程、Suno AI、Sora账号、Sora提示词、AI换脸、AI绘画等,帮助解决各种AI疑难杂症。
 最新文章