pioneer
2 years ago
commit
b240bd2599
8 changed files with 2172 additions and 0 deletions
@ -0,0 +1,6 @@
|
||||
# open-JSD-10625 |
||||
|
||||
JSD-10625 用户隐私信息如手机号邮箱脱敏处理\ |
||||
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 |
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><plugin> |
||||
<id>com.fr.plugin.user.tuomin</id> |
||||
<name><![CDATA[用户信息脱敏插件]]></name> |
||||
<active>yes</active> |
||||
<version>1.0</version> |
||||
<env-version>10.0</env-version> |
||||
<jartime>2018-07-31</jartime> |
||||
<vendor>fr.open</vendor> |
||||
<description><![CDATA[]]></description> |
||||
<change-notes><![CDATA[ |
||||
[2022-06-30]用户信息脱敏插件。<br/> |
||||
]]></change-notes> |
||||
|
||||
<extra-decision> |
||||
<ControllerRegisterProvider class="com.fr.plugin.user.tuomin.controller.UserTMControllerProvider"/> |
||||
<WebResourceProvider class="com.fr.plugin.user.tuomin.webresource.UserTMWebResourceProvider"/> |
||||
</extra-decision> |
||||
<function-recorder class="com.fr.plugin.user.tuomin.UserTMPluginLifecycleMonitor"/> |
||||
<lifecycle-monitor class="com.fr.plugin.user.tuomin.UserTMPluginLifecycleMonitor"/> |
||||
</plugin> |
@ -0,0 +1,24 @@
|
||||
package com.fr.plugin.user.tuomin; |
||||
|
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.plugin.context.PluginContext; |
||||
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; |
||||
import com.fr.plugin.transform.FunctionRecorder; |
||||
import com.fr.record.analyzer.EnableMetrics; |
||||
import com.fr.workspace.WorkContext; |
||||
|
||||
@EnableMetrics |
||||
@FunctionRecorder |
||||
public class UserTMPluginLifecycleMonitor extends AbstractPluginLifecycleMonitor { |
||||
|
||||
@Override |
||||
public void afterRun(PluginContext pluginContext) { |
||||
FineLoggerFactory.getLogger().info(pluginContext.getID() + "插件启动:"); |
||||
} |
||||
|
||||
@Override |
||||
public void beforeStop(PluginContext pluginContext) { |
||||
FineLoggerFactory.getLogger().info(pluginContext.getID()+"插件停止"); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,257 @@
|
||||
package com.fr.plugin.user.tuomin.controller; |
||||
|
||||
import com.fr.decision.authority.base.constant.type.operation.SyncOperationType; |
||||
import com.fr.decision.authority.controller.personnel.PersonnelController; |
||||
import com.fr.decision.authority.controller.personnel.PersonnelWork; |
||||
import com.fr.decision.sync.CascadeData; |
||||
import com.fr.decision.sync.SourceConflictData; |
||||
import com.fr.decision.sync.SourceConflictStrategy; |
||||
import com.fr.decision.sync.SyncDetail; |
||||
import com.fr.decision.sync.data.RowData; |
||||
import com.fr.decision.sync.result.FailedData; |
||||
import com.fr.decision.sync.result.SyncResultData; |
||||
import com.fr.decision.sync.result.SyncWorkResult; |
||||
import com.fr.decision.sync.work.SyncWork; |
||||
import com.fr.decision.sync.work.impl.*; |
||||
import com.fr.decision.webservice.interceptor.handler.PreHandlerFactory; |
||||
import com.fr.general.data.DataModel; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.script.Calculator; |
||||
|
||||
import java.lang.reflect.Field; |
||||
import java.util.Iterator; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
import java.util.TreeMap; |
||||
import java.util.Map.Entry; |
||||
import java.util.regex.Matcher; |
||||
import java.util.regex.Pattern; |
||||
|
||||
public class TableDataSyncAction implements PersonnelWork { |
||||
private SyncDetail syncDetail; |
||||
private DataModel dm; |
||||
private Map<Integer, SyncWork> syncWorks = new TreeMap(); |
||||
private UserSyncWork userSyncWork; |
||||
|
||||
public static com.fr.plugin.user.tuomin.controller.TableDataSyncAction create(SyncDetail var0) { |
||||
return new com.fr.plugin.user.tuomin.controller.TableDataSyncAction(var0); |
||||
} |
||||
|
||||
private TableDataSyncAction(SyncDetail var1) { |
||||
this.syncDetail = var1; |
||||
this.dm = var1.getSyncSource().buildTableData(var1.getDataSetName()).createDataModelWithTimeout(Calculator.createCalculator(), (int)var1.getRate()); |
||||
} |
||||
|
||||
public void before(PersonnelController var1) throws Exception { |
||||
this.registerSyncWorks(var1); |
||||
this.checkPlatformDirtyData(); |
||||
} |
||||
|
||||
|
||||
private static final String PW_PATTERN = "^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9\\W]{8,}$"; |
||||
|
||||
private boolean validatePwd(String pswd,String userName){ |
||||
boolean falg = false; |
||||
try { |
||||
if (null==pswd&&pswd.isEmpty()&&pswd.length()>9){ |
||||
return falg; |
||||
} |
||||
//不全是特殊符号 不全是数字 不全是字母 不全是大写 不全是小写
|
||||
if (pswd.matches(PW_PATTERN)){ |
||||
falg = true; |
||||
} |
||||
|
||||
} catch (Exception e) { |
||||
falg = false; |
||||
} |
||||
|
||||
if(falg == false){ |
||||
FineLoggerFactory.getLogger().info("密码强度验证:长度,大小写字母,符号不符合"); |
||||
return false; |
||||
} |
||||
|
||||
if(pswd.toLowerCase().indexOf(userName.toLowerCase()) != -1){ |
||||
FineLoggerFactory.getLogger().info("密码强度验证:密码不能包含用户名"); |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
public SyncResultData execute(PersonnelController var1) throws Exception { |
||||
this.clearDiffSource(); |
||||
this.preparePlatformData(); |
||||
this.beforePrepareSyncData(); |
||||
this.prepareSyncData(); |
||||
this.afterPrepareSyncData(); |
||||
Field[] fileds = this.userSyncWork.getClass().getDeclaredFields(); |
||||
for(int i = 0 ; i < fileds.length;i++) { |
||||
Field field = fileds[i]; |
||||
String fieldName = field.getName(); |
||||
FineLoggerFactory.getLogger().info("fieldName:"+fieldName); |
||||
if(fieldName.equals("syncNamePasswordMap")){ |
||||
try { |
||||
field.setAccessible(true); |
||||
Object obj = field.get( this.userSyncWork); |
||||
Map<String, String> syncNamePasswordMap = (Map<String, String>)obj; |
||||
FineLoggerFactory.getLogger().info("一共有几个用户导入:"+syncNamePasswordMap.size()); |
||||
Set<String> keys = syncNamePasswordMap.keySet(); |
||||
for(String key : keys){ |
||||
String pwd = syncNamePasswordMap.get(key).toString(); |
||||
//这里判断密码强度
|
||||
boolean isOk = validatePwd(pwd,key); |
||||
|
||||
if(isOk == false){ |
||||
SyncResultData resultData = new SyncResultData(); |
||||
resultData.setSuccessUserCount(-100); |
||||
return resultData; |
||||
} |
||||
} |
||||
} |
||||
catch (IllegalAccessException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
this.sourceCover(); |
||||
this.addOrUpdate(); |
||||
this.delete(); |
||||
return this.over(); |
||||
} |
||||
|
||||
private void registerSyncWorks(PersonnelController var1) { |
||||
this.userSyncWork = new UserSyncWork(var1, this.syncDetail); |
||||
SyncWork[] var2 = new SyncWork[]{userSyncWork, new DepartmentSyncWork(var1, this.syncDetail), new PostSyncWork(var1, this.syncDetail), new CustomRoleSyncWork(var1, this.syncDetail), new DepRoleSyncWork(var1, this.syncDetail), new UserRoleMiddleSyncWork(var1, this.syncDetail)}; |
||||
SyncWork[] var3 = var2; |
||||
int var4 = var2.length; |
||||
|
||||
for(int var5 = 0; var5 < var4; ++var5) { |
||||
SyncWork var6 = var3[var5]; |
||||
this.syncWorks.put(var6.processOrder(), var6); |
||||
} |
||||
|
||||
} |
||||
|
||||
private void checkPlatformDirtyData() throws Exception { |
||||
Iterator var1 = this.syncWorks.values().iterator(); |
||||
|
||||
while(var1.hasNext()) { |
||||
SyncWork var2 = (SyncWork)var1.next(); |
||||
var2.checkPlatformDirtyData(); |
||||
} |
||||
|
||||
} |
||||
|
||||
private void preparePlatformData() throws Exception { |
||||
Iterator var1 = this.syncWorks.values().iterator(); |
||||
|
||||
while(var1.hasNext()) { |
||||
SyncWork var2 = (SyncWork)var1.next(); |
||||
var2.preparePlatformData(); |
||||
} |
||||
|
||||
} |
||||
|
||||
private void beforePrepareSyncData() throws Exception { |
||||
Iterator var1 = this.syncWorks.values().iterator(); |
||||
|
||||
while(var1.hasNext()) { |
||||
SyncWork var2 = (SyncWork)var1.next(); |
||||
var2.beforePrepareSyncData(this.dm); |
||||
} |
||||
|
||||
} |
||||
|
||||
private void prepareSyncData() throws Exception { |
||||
for(int var1 = 0; var1 < this.dm.getRowCount(); ++var1) { |
||||
RowData var2 = new RowData(var1); |
||||
Iterator var3 = this.syncWorks.values().iterator(); |
||||
|
||||
while(var3.hasNext()) { |
||||
SyncWork var4 = (SyncWork)var3.next(); |
||||
var4.prepareSyncData(this.dm, var2); |
||||
} |
||||
} |
||||
|
||||
this.dm.release(); |
||||
} |
||||
|
||||
private void afterPrepareSyncData() throws Exception { |
||||
CascadeData var1 = new CascadeData(); |
||||
|
||||
SyncWork var3; |
||||
for(Iterator var2 = this.syncWorks.values().iterator(); var2.hasNext(); var1 = var3.afterPrepareSyncData(var1)) { |
||||
var3 = (SyncWork)var2.next(); |
||||
} |
||||
|
||||
} |
||||
|
||||
private void sourceCover() throws Exception { |
||||
SourceConflictData var1 = new SourceConflictData(); |
||||
|
||||
SyncWork var3; |
||||
for(Iterator var2 = this.syncWorks.values().iterator(); var2.hasNext(); var1 = var3.resolveSourceConflict(var1)) { |
||||
var3 = (SyncWork)var2.next(); |
||||
} |
||||
|
||||
} |
||||
|
||||
private void addOrUpdate() throws Exception { |
||||
Iterator var1 = this.syncWorks.values().iterator(); |
||||
|
||||
while(var1.hasNext()) { |
||||
SyncWork var2 = (SyncWork)var1.next(); |
||||
var2.addOrUpdate(); |
||||
} |
||||
|
||||
} |
||||
|
||||
private void delete() throws Exception { |
||||
if (this.syncDetail.getOperationType() == SyncOperationType.KEY) { |
||||
CascadeData var1 = new CascadeData(); |
||||
Iterator var2 = this.syncWorks.values().iterator(); |
||||
|
||||
while(var2.hasNext()) { |
||||
SyncWork var3 = (SyncWork)var2.next(); |
||||
var3.delete(var1); |
||||
} |
||||
|
||||
} |
||||
} |
||||
|
||||
private void clearDiffSource() throws Exception { |
||||
if (this.syncDetail.getSourceConflictStrategy() == SourceConflictStrategy.CLEAR) { |
||||
SyncWork[] var1 = new SyncWork[]{(SyncWork)this.syncWorks.get(1), (SyncWork)this.syncWorks.get(5), (SyncWork)this.syncWorks.get(2), (SyncWork)this.syncWorks.get(3), (SyncWork)this.syncWorks.get(4)}; |
||||
SyncWork[] var2 = var1; |
||||
int var3 = var1.length; |
||||
|
||||
for(int var4 = 0; var4 < var3; ++var4) { |
||||
SyncWork var5 = var2[var4]; |
||||
var5.clearDiffSource(); |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
private SyncResultData over() throws Exception { |
||||
SyncResultData var1 = new SyncResultData(); |
||||
Iterator var2 = this.syncWorks.entrySet().iterator(); |
||||
|
||||
while(var2.hasNext()) { |
||||
Entry var3 = (Entry)var2.next(); |
||||
SyncWorkResult var4 = ((SyncWork)var3.getValue()).over(); |
||||
if (var4 != null) { |
||||
if ((Integer)var3.getKey() == 1) { |
||||
var1.setSuccessUserCount(var4.getAddOrUpdateCount()); |
||||
var1.setCurrentUserCount(var4.getCurrentCount()); |
||||
} |
||||
|
||||
var1.addFailedData(var4.getRoleType(), (FailedData[])var4.getFailedData().toArray(new FailedData[0])); |
||||
var1.addOtherSourceRole(var4.getRoleType(), (String[])var4.getDiffSourceData().toArray(new String[0])); |
||||
} |
||||
} |
||||
|
||||
return var1; |
||||
} |
||||
} |
||||
|
@ -0,0 +1,132 @@
|
||||
package com.fr.plugin.user.tuomin.controller; |
||||
|
||||
|
||||
import com.fr.config.Configuration; |
||||
import com.fr.decision.authority.AuthorityContext; |
||||
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; |
||||
import com.fr.decision.config.Encryption; |
||||
import com.fr.decision.config.EncryptionConfig; |
||||
import com.fr.decision.config.SystemConfig; |
||||
import com.fr.decision.config.UserDataSetConfig; |
||||
import com.fr.decision.sync.SyncDetail; |
||||
import com.fr.decision.sync.SyncUserStatus; |
||||
import com.fr.decision.sync.result.SyncResultData; |
||||
import com.fr.decision.webservice.Response; |
||||
import com.fr.decision.webservice.annotation.DecisionControllerLog; |
||||
import com.fr.decision.webservice.annotation.LoginStatusChecker; |
||||
import com.fr.decision.webservice.annotation.VisitRefer; |
||||
import com.fr.decision.webservice.bean.user.UserDataSetBean; |
||||
import com.fr.decision.webservice.bean.user.UserImportOperation; |
||||
import com.fr.decision.webservice.exception.user.EncryptChangeUserNotCleanupException; |
||||
import com.fr.decision.webservice.v10.login.LoginService; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.intelligence.IntelligenceRuntimeException; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.record.analyzer.EnableMetrics; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
import com.fr.third.springframework.stereotype.Controller; |
||||
import com.fr.third.springframework.web.bind.annotation.*; |
||||
import com.fr.transaction.Configurations; |
||||
import com.fr.transaction.Worker; |
||||
import com.fr.transaction.WorkerAdaptor; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
@EnableMetrics |
||||
@Controller |
||||
@LoginStatusChecker( |
||||
required = false |
||||
) |
||||
@RequestMapping({"/{version}"}) |
||||
public class UserTMController { |
||||
|
||||
@RequestMapping( |
||||
value = {"/dataset/newUsers"}, |
||||
method = {RequestMethod.POST} |
||||
) |
||||
|
||||
@VisitRefer( |
||||
refer = {"decision-management-user-add"} |
||||
) |
||||
@ResponseBody |
||||
public Response importUser(HttpServletRequest req, HttpServletResponse res, @PathVariable("version") String version, @RequestBody UserDataSetBean userDataSet, @RequestParam(value = "importOp",required = false,defaultValue = "0") int importOp) throws Exception { |
||||
String currentUser = LoginService.getInstance().getUserNameFromRequest(req); |
||||
FineLoggerFactory.getLogger().info("导入数据......"); |
||||
SyncUserStatus status = importUsers(currentUser, userDataSet, UserImportOperation.parse(importOp)); |
||||
if(status.getResultData().getSuccessUserCount() == -100){ |
||||
return Response.error("500","导入失败,用户密码不满足密码强度"); |
||||
} |
||||
else{ |
||||
return Response.ok(status); |
||||
} |
||||
|
||||
} |
||||
|
||||
public SyncUserStatus importUsers(String currentUserName, UserDataSetBean userDataSetBean, UserImportOperation userImportOperation) throws Exception { |
||||
Encryption oldEncryption = EncryptionConfig.getInstance().getEncryption(ManualOperationType.KEY); |
||||
int oldEmbedEncryption = oldEncryption.getEncryption(); |
||||
final int newEmbedEncryption = userDataSetBean.getEncryption(); |
||||
final String newEmbedCustomEncrypt = userDataSetBean.getCustomEncrypt(); |
||||
boolean encryptionChanged = !ComparatorUtils.equals(oldEmbedEncryption, newEmbedEncryption) || !ComparatorUtils.equals(oldEncryption.getCustomEncrypt(), userDataSetBean.getCustomEncrypt()); |
||||
userDataSetBean.setTurnOn(false); |
||||
if (userImportOperation != UserImportOperation.CLEAR && encryptionChanged) { |
||||
throw new EncryptChangeUserNotCleanupException(); |
||||
} else { |
||||
if (userImportOperation == UserImportOperation.CLEAR) { |
||||
UserService.getInstance().deleteAllCommonUsers((String)UserService.getInstance().getAdminUserNameList().get(0)); |
||||
AuthorityContext.getInstance().getCustomRoleController().remove(QueryFactory.create().addRestriction(RestrictionFactory.eq("creationType", ManualOperationType.KEY)).addRestriction(RestrictionFactory.neq("id", "super-user-custom-role"))); |
||||
AuthorityContext.getInstance().getDepartmentController().remove(QueryFactory.create().addRestriction(RestrictionFactory.eq("creationType", ManualOperationType.KEY))); |
||||
AuthorityContext.getInstance().getPostController().remove(QueryFactory.create().addRestriction(RestrictionFactory.eq("creationType", ManualOperationType.KEY))); |
||||
} |
||||
|
||||
Configurations.update(new Worker() { |
||||
public void run() { |
||||
Encryption embedEncrypt = new Encryption(); |
||||
embedEncrypt.setEncryption(newEmbedEncryption); |
||||
embedEncrypt.setCustomEncrypt(newEmbedCustomEncrypt); |
||||
EncryptionConfig.getInstance().removeEncryption(ManualOperationType.KEY); |
||||
EncryptionConfig.getInstance().setEncryption(ManualOperationType.KEY, embedEncrypt); |
||||
} |
||||
|
||||
public Class<? extends Configuration>[] targets() { |
||||
return new Class[]{UserDataSetConfig.class, EncryptionConfig.class}; |
||||
} |
||||
}); |
||||
|
||||
SyncUserStatus var10; |
||||
try { |
||||
SyncDetail detail = SyncDetail.parse(userDataSetBean); |
||||
SyncResultData syncResultData = AuthorityContext.getInstance().doPersonnelWork(TableDataSyncAction.create(detail)); |
||||
SyncUserStatus var11 = (new SyncUserStatus()).resultData(syncResultData); |
||||
return var11; |
||||
} catch (IntelligenceRuntimeException var15) { |
||||
var10 = (new SyncUserStatus()).status(SyncUserStatus.Status.FAIL).error(var15); |
||||
} finally { |
||||
if (userImportOperation == UserImportOperation.CLEAR && encryptionChanged) { |
||||
class NamelessClass_1 extends WorkerAdaptor { |
||||
NamelessClass_1(Class x0, Class... x1) { |
||||
super(x0, x1); |
||||
} |
||||
|
||||
public void run() { |
||||
SystemConfig.getInstance().setServerInitStatus("fail"); |
||||
} |
||||
} |
||||
|
||||
Configurations.update(new NamelessClass_1(SystemConfig.class, new Class[0])); |
||||
} |
||||
|
||||
} |
||||
|
||||
return var10; |
||||
} |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,14 @@
|
||||
package com.fr.plugin.user.tuomin.controller; |
||||
|
||||
import com.fr.decision.fun.impl.AbstractControllerRegisterProvider; |
||||
|
||||
public class UserTMControllerProvider extends AbstractControllerRegisterProvider { |
||||
|
||||
@Override |
||||
public Class<?>[] getControllers() { |
||||
return new Class[]{ |
||||
UserTMController.class |
||||
}; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,33 @@
|
||||
package com.fr.plugin.user.tuomin.webresource; |
||||
|
||||
import com.fr.decision.fun.impl.AbstractWebResourceProvider; |
||||
import com.fr.decision.web.MainComponent; |
||||
import com.fr.intelli.record.Focus; |
||||
import com.fr.record.analyzer.EnableMetrics; |
||||
import com.fr.web.struct.Atom; |
||||
import com.fr.web.struct.Component; |
||||
import com.fr.web.struct.browser.RequestClient; |
||||
import com.fr.web.struct.category.ParserType; |
||||
import com.fr.web.struct.category.ScriptPath; |
||||
import com.fr.web.struct.category.StylePath; |
||||
|
||||
public class UserTMWebResourceProvider extends AbstractWebResourceProvider{ |
||||
|
||||
@Override |
||||
public Atom attach() { |
||||
return MainComponent.KEY; |
||||
} |
||||
|
||||
public Atom[] clients() { |
||||
return new Atom[]{ |
||||
new Component() { |
||||
@Override |
||||
public ScriptPath script(RequestClient client) { |
||||
return ScriptPath.build( "com/fr/plugin/user/tuomin/userinfo.js", ParserType.DYNAMIC ); |
||||
} |
||||
|
||||
} |
||||
}; |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue