删除Camunda镜像中默认的demo用户

背景

Camunda Platform的Tomcat分发包,启动后会自动创建一个用户名和密码都是demo的用户,但是有的时候我们并不需要它,本文介绍如何取消这个默认的用户。

结论

移除掉camunda-invoice这个示例应用。

如果demo这个用户已经被创建,则需要先停止Camunda服务,然后删除或清空数据库,再删除camunda-invoice目录,最后重新启动Camunda服务。

本地文件

直接删除camunda-bpm-tomcat-xxx\server\apache-tomcat-xxx\webapps\camunda-invoice中这个目录

image-20210728233831526

Docker镜像

编写Dockerfile文件,新构建一个新的镜像:

1
2
3
4
5
FROM camunda/camunda-bpm-platform:7.15.0

MAINTAINER Tony

RUN rm -rf /camunda/webapps/camunda-invoice

也可以通过挂载本地的一个空目录到容器的webapps目录来实现:

1
2
3
docker run -d --name camunda -p 8080:8080 \
-v $PWD/webapps/:/camunda/webapps/ \
camunda/camunda-bpm-platform:latest

分析

使用IntellJ IDEA或其它IDE打开camunda-bpm-tomcat-7.12.0\server\apache-tomcat-9.0.24\webapps\camunda-invoice\WEB-INF\classes\org\camunda\bpm\example\invoice目录下的两个Java字节码文件:InvoiceProcessApplication.classDemoDataGenerator.class

InvoiceProcessApplication这个类被org.camunda.bpm.application.ProcessApplication注解修饰,即它成为了整个程序的入口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@PostDeploy	//org.camunda.bpm.application.PostDeploy这个注解标注的方法会在Camunda引擎部署好之后执行
public void startFirstProcess(ProcessEngine processEngine)
{
this.createUsers(processEngine); // 调用当前类的一个私有方法
ProcessEngineConfigurationImpl processEngineConfiguration = (ProcessEngineConfigurationImpl)processEngine.getProcessEngineConfiguration();
processEngineConfiguration.setDbMetricsReporterActivate(true);
processEngineConfiguration.getDbMetricsReporter().setReporterId("REPORTER");
this.startProcessInstances(processEngine, "invoice", 1);
this.startProcessInstances(processEngine, "invoice", (Integer)null);
processEngineConfiguration.setDbMetricsReporterActivate(false);
}

private void createUsers(ProcessEngine processEngine)
{
(new DemoDataGenerator()).createUsers(processEngine);// 实例化DemoDataGenerator,调用createUsers方法创建用户
}

DemoDataGenerator这个类负责实际的创建demo用户的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void createUsers(ProcessEngine engine) 
{
IdentityServiceImpl identityService = (IdentityServiceImpl)engine.getIdentityService();
if (identityService.isReadOnly()) {
LOGGER.info("Identity service provider is Read Only, not creating any demo users.");
} else {
User singleResult = (User)identityService.createUserQuery().userId("demo").singleResult();
if (singleResult == null) {
LOGGER.info("Generating demo data for invoice showcase");
User user = identityService.newUser("demo");
user.setFirstName("Demo");
user.setLastName("Demo");
user.setPassword("demo");
user.setEmail("demo@camunda.org");
identityService.saveUser(user, true);
... ... // 省略创建其它用户、组、角色、权限的过程
}
}
}

参考