注:本文所涉及的相关技术和工具包,由于具有超强的入侵能力,禁止用于商城插件。以免大面积使用带来的不稳定风险!仅能在定制任务中取得负责人许可的情况下使用!
在学习了TemplateEncryptProvider接口之后,开发者可以对所有的模板进行统一的加解密。但如果需要根据模板的不同设置或者是根据模板的路径等等其他信息来确定是否加密,以及加密的策略。则单一的TemplateEncryptProvider难以满足需要。
本文以一个具体场景为例,说明复杂场景的模板加解密的实现基本过程。
场景:区别于当前产品的模板统一密钥加解密,实现每个模板单独设置加密密钥。用户编辑加密的模板前需要先验证改模板的密钥,合法后才能编辑。
1.首先利用动态字节码工具包,在模板的保存和编辑触发逻辑中注入一个临时的切面。以便传递相关的环境信息和插入UI交互逻辑
package com.tptj.demo.hg.template.encrypt; import com.fr.base.io.EncryptIOFileProxy; import com.fr.base.io.IOFile; import com.fr.file.FILE; import com.fr.invoke.Reflect; import com.fr.log.FineLoggerFactory; import com.tptj.demo.hg.template.encrypt.ui.DecodeDialog; import com.tptj.demo.hg.template.encrypt.ui.SpEncryptAttrMark; /** * @author 秃破天际 * @version 10.0 * Created by 秃破天际 on 2021/9/12 **/ public class BaseInterceptor { /** * 在打开模板前对加密的模板插入输入密码的弹窗 * @param file */ public static void intercept4Edit(FILE file){ try { file.asInputStream(); if( !DemoEncryptor.hasSecret() ){ return; } String secret = DemoEncryptor.getSecret(); secret = new DecodeDialog(file,secret).getSecret(); DemoEncryptor.setSecret(secret); } catch (Exception e) { FineLoggerFactory.getLogger().error(e,e.getMessage()); } } /** * 在保存模板前获取配置的模板密钥,以便加密接口进行加密 * @param origin */ public static void intercept4Save( EncryptIOFileProxy origin ){ IOFile report = Reflect.on(origin).get("file"); SpEncryptAttrMark mark = report.getAttrMark(SpEncryptAttrMark.XML_TAG); if( null != mark ){ DemoEncryptor.setSecret(mark.getSecret()); } } } |
package com.fr.design.mainframe.app; import com.fr.file.FILE; import com.fr.main.impl.WorkBook; import com.tptj.demo.hg.template.encrypt.BaseInterceptor; import com.tptj.tool.hg.dynamic.agent.source.AccessPoint; import com.tptj.tool.hg.dynamic.agent.source.Context; import com.tptj.tool.hg.dynamic.agent.source.Source; import com.tptj.tool.hg.dynamic.agent.version.ModuleReport; import com.tptj.tool.hg.dynamic.agent.version.VersionChecker; /** * @author 秃破天际 * @version 10.0 * Created by 秃破天际 on 2021/9/11 * 注入CptApp#asIOFile 的切面,在打开加密cpt时,注入密码输入UI交互 **/ @VersionChecker(value = 10020210101l, loader = ModuleReport.class) @Source(CptApp.class) public class SpCptApp extends Context { @AccessPoint public WorkBook asIOFile(FILE file, boolean needCheck) { BaseInterceptor.intercept4Edit(file); return null; } } |
免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。若作为商用一切后果责任由使用者自行承担。
demo-parameter-decode【两种接口实现的基于MD5的密码防篡改代码】