系统授权码接入
集成koca的OEM业务组件,替换原有的系统管理模块中的应用授权码功能,支持系统的授权以及模块的授权功能:
系统授权:通过在主类上增加注解,如果授权码过期则程序无法启动。
模块授权:通过在接口上增加注解,如果授权码过期则返回定义的报错信息,如果授权码仍然有效则返回授权码剩余天数(仅各大登录接口返回天数,其余接口返回值不变)。
如何集成?
1、引入依赖
<dependency>
<groupId>com.szkingdom.koca.admin</groupId>
<artifactId>koca-admin-oem-client</artifactId>
<version>4.0.0</version>
</dependency>
2、增加认证类
@Primary
@Component
public class KemsVerifier extends DefaultLicenseVerifier implements LicenseVerifier {
private static String endTime;
public static String getEndTime() {
return endTime;
}
@Override
public VerifyResult verify(LicenseFactor licenseFactor) {
if (licenseFactor == null) {
return VerifyResult.fail("授权码为空值!");
}
String startTime = licenseFactor.getStartTime();
String endTime = licenseFactor.getEndTime();
String authType = licenseFactor.getAuthType();
// 根据授权类型,校验到期时间
if (!CheckUtils.checkEndTime(endTime)) {
// 试用版/默认(到期即不可用)
if (authType == null || !authType.equals(AuthType.OFFICIAL.getType())) {
return VerifyResult.fail("授权码已到期!" + licenseFactor.toPrintString());
}
// 正式版(到期一年后不可用)
if (!CheckUtils.checkEndTimeOneYear(endTime)) {
return VerifyResult.fail("授权码已过期超一年!" + licenseFactor.toPrintString());
}
log.warn("授权码已到期!请于到期一年内向管理员重新获取授权码!否则将影响您的使用!" + licenseFactor.toPrintString());
}
// 校验起始时间
if (!CheckUtils.checkStartTime(startTime)) {
return VerifyResult.fail("授权码未生效!" + licenseFactor.toPrintString());
}
KemsVerifier.endTime = endTime;
VerifyResult.success(endTime);
}
}
3、增加注解
模块授权:在需要检验的接口上增加注解
@VLicense(model = "login", vClass = KemsVerifier.class)
系统授权:在主类上增加注解
@VLicense(system = "kems", version = "3.4.0", vClass = KemsVerifier.class)
注:
3.2.1+版本kems默认在支持的用户名密码登录,短信验证码登录,统一身份认证登录,企业微信扫码登录接口增加模块授权注解且剩余有效期。
3.4.0+版本kems默认额外在module-system模块启动类增加系统授权注解且剩余有效期
如何返回剩余有效期?
以用户名密码登录为例, 登录成功之后,在接口的返回值中增加days属性和appLicenseMsg属性
days: license的剩余有效期
如果剩余有效期大于等于0小于等于30天,前端将loginMsg+appLicenseMsg进行黄色展示
如果有效期大于30天,则仍旧将loginMsg进行绿色展示
如果剩余有效期小于0,则会以红色的报错告知,登录失败授权码已过期
appLicenseMsg: 登录成功后的提示信息
// 构造others 包含授权码剩余有效期
Map<String, Object> others = new HashMap<>(12);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
others.put("loginMsg", SystemResultMessage.RECENT_LOGIN_TIME.getMessage() +
sdf.format(logininforDTO.getAccessTime()) + " " + SystemResultMessage.LOGIN_IP.getMessage() +
logininforDTO.getIpaddr());
// 解析字符串为LocalDate对象
LocalDate givenDate = LocalDate.parse(KemsVerifier.getEndTime(), DateTimeFormatter.BASIC_ISO_DATE);
// 计算相差天数
Duration diff = Duration.between(LocalDate.now().atStartOfDay(), givenDate.atStartOfDay());
long days = diff.toDays();
others.put("days", days);
others.put("appLicenseMsg", SystemResultMessage.AUTHORIZATION_REMAINING_TIME.getMessage() + days
+ SystemResultMessage.DAY.getMessage());
trustedPrincipal.setOthers(others);
return Result.success(SystemResultMessage.LOGIN_SUCCESS, trustedPrincipal);
注:如果接口没有返回days属性和appLicenseMsg属性,则升级网关pom中认证插件的版本
如果使用的是kems2.4.0及以下版本
<dependency>
<groupId>szkingdom.jzyq.taoism.kems.plug</groupId>
<artifactId>kems-plug-auth-webflux</artifactId>
<version>2.4.1</version>
</dependency>
如果使用的是kems3.0.0及以上版本,则引入认证插件的版本号>=3.2.1
<dependency>
<groupId>com.kingengine.kems.plug</groupId>
<artifactId>kems-plug-auth-webflux</artifactId>
<version>3.x.x</version>
</dependency>
4、新增配置
在application.yml中增加如下配置
koca:
oem:
publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtr5WsvT+QC7IgWyb0FKP75+x8a9AWpsu1eLg0OzS97IBkohz+1NRdOLEo0w6jIxmY0afYqSeyQkUhifxD+RLUbq7CYPbI4Biz4tqpiq9nkJ3iCiekyS5cJi0JvE72VP5KFG2FrtifpLG0Xz3NpiBtzZEKsYQCL+OgFVhVvo+Mx0u/1+ichOiom1eMYLhRkcDzgCU+3WZxU1FCxA+WKI+qWa8gzcUpZMW9UP8GUMzcbq2Xgw7x5pUfNkzs6Zlw6UMyAFmLNmXsrCn0kTFY1UUFNLcqBV3dW+JM/C4FJb9dzTzOlNjd1hSs9rDyHXyinGvx7ZMmvyDE45V84uV5knOWwIDAQAB
注: publicKey请联系韩朋成
5、增加授权文件
license.txt需和jar包放于服务器的同一目录下,每行为独立的一条授权码(本地是放于resource下,服务器不同!!),如下图所示:
注: license.txt授权文件请联系韩朋成