1、选择一个开源项目

首先,在开始集成项目之前,选选择一个开源项目作为“底座”进行集成,由于作者对小诺的开源项目比较熟悉,所以选择xiaonuo的vue单体版本,作为底座进行集成: 小诺开源技术

当然如果你对其他开源项目比较熟悉,也可以使用其他的开源项目,也是一样的效果。

2、下载camunda官方继承springboot案例

Download Open Source Workflow Software | Camunda

这个链接是官方的一些资源的链接,如果你想直接跑一下camunda的项目,可以直接下下来看看,最重要的是modeler设计器,要下载下来安卓到您的个人电脑上

Download The Camunda BPMN / DMN Process Modeler | Camunda

Camunda Platform Initializr

这个是camunda官方集成springboot的一个资源,可以下载下来,主要看一下它集成的pom包都有哪些。

3、camunda集成所需要的包

上面已经说了,关于camunda集成项目所需要的包都在官方集成的那个资源案例中,笔者在写这篇文章时案例为camunda的7.15版本。所以集成的过程包是7.15版本,如果后来更新了,那么就按照上面说的那个步骤找一下springboot集成所需要的最近的版本包就可以了。

<!--camunda的依赖包start-->
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
            <version>7.15.0</version>
        </dependency>
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
            <version>7.15.0</version>
        </dependency>
        <dependency>
            <groupId>org.camunda.bpm</groupId>
            <artifactId>camunda-engine-plugin-spin</artifactId>
        </dependency>
        <dependency>
            <groupId>org.camunda.spin</groupId>
            <artifactId>camunda-spin-dataformat-all</artifactId>
        </dependency>
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-test</artifactId>
            <version>7.15.0</version>
        </dependency>
        <!--camunda的依赖包end-->

这是7.15版本集成,所需要的包。

将上述的pom文件集成到项目中就可以了。

配置camunda平台超管账户

camunda.bpm.admin-user:
  id: admin
  password: admin

其实从某种意义上来说,camunda的基础集成已经完成了,启动后端项目,输入camunda的地址: http://localhost:82/camunda/app/welcome/default/#!/login

会发现无法进行访问,或者说访问异常,其实原因是因为你的项目被你自己的项目权限了拦截掉了,所以说,此时要对camunda项目和你自己的项目权限进行对接

4、xianuo权限放行camunda相关接口

Configure Authentication | docs.camunda.org

首先根据camunda官方的文档,可以看出,camunda所有接口在不进行任何配置的情况下,默认是被放开的,也就是说,此时你访问: http://localhost:82/camunda/app/welcome/default/#!/login 无法访问到,问题不是出现在camunda身上,而是你自己原来的系统上,其实不难想出答案,就是出现在权限上,所以这个时候,需要将你系统(xiaonuo)的权限关于camunda的接口全部放开

            // modeler 流程部署接口
            "/engine-rest/**",
            // modeler 表单部署
            "/forms/**",
            // camunda工作流(web)
            "/camunda/**",
            // "/**",

此时你再启动项目就可以正常访问

5、camunda权限开启

有的小伙伴,肯定会想,原系统也就是xiaonuo将camunda的权限放开了,那camunda系统的权限默认又是关闭的,要是部署到生产环境,那工作流岂不是裸奔吗?确实是存在这样的问题,关于官方文档开启权限,那段也没有描述在springboot中如何实现camunda的权限开启,后来在camunda的官方论坛上找到了相关的代码,笔者做了一些改进:

package com.cn.xiaonuo.core.filter;
import org.camunda.bpm.engine.rest.security.auth.ProcessEngineAuthenticationFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 * @author 87761
@Configuration
public class CamundaSecurityFilter {
    @Bean
    public FilterRegistrationBean<ProcessEngineAuthenticationFilter> processEngineAuthenticationFilter() {
        FilterRegistrationBean<ProcessEngineAuthenticationFilter> processEngineAuthenticationFilterRegistrationBean = new FilterRegistrationBean<>();
        processEngineAuthenticationFilterRegistrationBean.setName("camunda-auth");
        processEngineAuthenticationFilterRegistrationBean.setFilter(new ProcessEngineAuthenticationFilter());
        processEngineAuthenticationFilterRegistrationBean.addInitParameter("authentication-provider", "com.cn.xiaonuo.core.provider.CamundaAuthenticationProvider");
        processEngineAuthenticationFilterRegistrationBean.addUrlPatterns("/camunda/*","/engine-rest/*");
        return processEngineAuthenticationFilterRegistrationBean;
package com.cn.xiaonuo.core.provider;
import com.cn.xiaonuo.core.context.login.LoginContextHolder;
import com.cn.xiaonuo.core.pojo.login.SysLoginUser;
import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.identity.User;
import org.camunda.bpm.engine.impl.digest._apacheCommonsCodec.Base64;
import org.camunda.bpm.engine.rest.security.auth.AuthenticationProvider;
import org.camunda.bpm.engine.rest.security.auth.AuthenticationResult;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.HttpHeaders;
 * @author 87761
public class CamundaAuthenticationProvider implements AuthenticationProvider {
    protected static final String BASIC_AUTH_HEADER_PREFIX = "Basic ";
    protected static final String TOKEN_TYPE_BEARER = "Bearer";
    @Override
    public AuthenticationResult extractAuthenticatedUser(HttpServletRequest request,
                                                         ProcessEngine engine) {
        String authorizationHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
        if (authorizationHeader != null) {
            if(authorizationHeader.startsWith(BASIC_AUTH_HEADER_PREFIX)){
                String encodedCredentials = authorizationHeader.substring(BASIC_AUTH_HEADER_PREFIX.length());
                String decodedCredentials = new String(Base64.decodeBase64(encodedCredentials));
                int firstColonIndex = decodedCredentials.indexOf(":");
                if (firstColonIndex != -1) {
                    String userName = decodedCredentials.substring(0, firstColonIndex);
                    String password = decodedCredentials.substring(firstColonIndex + 1);
                    if (isAuthenticated(engine, userName, password)) {
                        return AuthenticationResult.successful(userName);
            if(authorizationHeader.startsWith(TOKEN_TYPE_BEARER)){
                SysLoginUser sysLoginUser = LoginContextHolder.me().getSysLoginUser();
                // AuthService authService = SpringUtil.getBean(AuthService.class);
                User user = engine.getIdentityService().createUserQuery().userId(sysLoginUser.getAccount()).singleResult();
                if(!StringUtils.isEmpty(user)){
                    return AuthenticationResult.successful(user.getId());
        return AuthenticationResult.unsuccessful();
    protected boolean isAuthenticated(ProcessEngine engine, String userName, String password) {
        return engine.getIdentityService().checkPassword(userName, password);
    @Override
    public void augmentResponseByAuthenticationChallenge(
            HttpServletResponse response, ProcessEngine engine) {
        response.setHeader(HttpHeaders.WWW_AUTHENTICATE, BASIC_AUTH_HEADER_PREFIX + "realm=\"" + engine.getName() + "\"");

开启springboot中camunda的权限如上,其实大概的意思就是xianuo那边放开的camunda的所有接口权限,那么camunda这边也要将这些权限给管理起来

对于小诺来说,系统原有的鉴权要稍微改一下

 原因是因为xiaonuo这边只要请求头中有Authorization他就拿去跑鉴权了,而camunda中的请求头中确实也有Authorization,只不过,开头不太一样,它是Basic开头的,而xiaonuo是以Bearer开头的,所以这个地方建议,判断的规则最好改成是否已Bearer开头,如果不是就直接返回null就好了。

6、鉴权开启效果

1、modeler设计器在部署的时候会要求你输入账户和密码

 2、输入网址后它会要求你输入账户和密码

 输入正确之后才会出现登录页面

该项目演示了Camunda Spin插件和Jackson ObjectMapper的用法,这些插件将配置为具有与标准Spring Boot ObjectMapper相同的属性。 Camunda Engine可以通过插件扩展。 最有趣的之一是Spin-Plugin,您可以使用它使用aplication/json或application/xml Mime-Type对过程变量进行序列化/反序列化。 在Spring Framework中,通常可以将Camunda插件注册为Spring Bean,然后将其连接到Camunda Engine。 但是Spin-Plugin使用Jackson ObjectMapper将过程变量序列化/反序列化为application/json 。 通过标准Java SPI(服务提供商接口)实例化此ObjectMapper,因此,使用非标准功能配置此Obje import io.swagger.annotations.ApiOperation; import org.camunda.bpm.engine.IdentityService; import org.camunda.bpm.engine.identity.*; import org.camunda.bpm.engine.impl.identity.Account; import org.camunda.bpm.engine.im 在[《\[8\]深入浅出工作开源框架Camunda:用户查看任务权限控制》](https://blog.csdn.net/chancein007/category_11590772.html) 的章节,我们提到了通过给用户user2赋予查看所有任务或者特定任务的权限,可以实现给user2的任务传阅的功能;但是这个时候user2也仅仅是查看任务;而不能修改当前任务的执行人,比如下图,尝试修改成不成功!但是如果用户就是想修改某个任务或者所有任务的执行人的时候,那么这个时候,权限管理应该如何配置呢?根据上面的信 一般Camunda会自动初始化mysql生成act_开头的49张表,如需手动初始化sql,可去官网找到对应版本(此例中Camunda版本为7.18.0)的sql脚本文件,然后如上启动流程的时候给流程变量flag初始化和赋值,后续提交任务的时候,也可随时通过修改流程变量的值来控制流程分支的走向。其中:”可执行文件“,这个选项需要勾选上,不然流程部署后,3.b.启动流程实例步骤获取不到definitionId。其中流程变量deptMajor,在启动流程时候,需要定义数据类型(值可以先不定义) snowy开源版本拉取: Snowy: ????Snowy基于SpringBoot+AntDesignVue的前后分离全新RBAC权限管理系统,适配国产数据库(金仓、达梦)、主流数据库Mysql、Oracle、Mssql、Postgresql,小诺一致追求简洁干净,一套代码搞定!支持国产中间件部署、麒麟操作系统、Windows、Linux部署使用,另外支持saas多租户、flowable工作流、多数据源、支付模块等,更多插件正在扩展中。https://gitee.com/xiaonuobase/snowy 在Camunda的WebApp中,其是通过管理员的认证授权来实现的。默认情况下,新建的用户是没有任何权限的。比如咱们创建一个用户user2, 当用户user2登录后,其登录页面是一个空白的页面,即使当前启动了一个流程,而且流程里面有一个任务就需要user2来处理,其登录进来后还是上面的页面。 那在给User2授权之前,数据库里面发生了什么事情呢?我们可以看到数据库的ACT_RU_AUTHORIZATION表新增了一条数据。 最近做的一个运营商的项目,用了Camunda的工作流引擎来进行任务的编排与执行,每隔15分钟会运行一个任务,获取大约800多个网元的过去一段时间的性能指标,并根据预先定义的规则表的指标判断规则,来识别网元是否有告警,每次任务运行时间都比较长,大概需要6到7分钟完成。除此之外,这个工作流引擎还有很多其他的任务会不定时的运行,整个引擎的负荷比较高。然后在最近一段时间内,频繁出现无法访问Camunda API的问题,报错信息是HTTP 500 Error,报错信息是message: "Could not open rest client 是什么 除了内置流程引擎应用, 有时候我们其他应用也需要访问 camunda platform, 这时候可以通过 camunda rest API实现, 为了简化rest api的调用, 开源社区已经有了两个 rest client 包. 能做什么: History 查询 流程流转控制 不能做什么: 不支持 JavaDelegate 不支持 Exec... 基于Camunda 7.17.0 + Springboot 2.6.4首先官网camunda7.17对应的springboot版本。camunda官网流程引擎:camunda-bpm-spring-boot-starterRest服务接口:camunda-bpm-spring-boot-starter-restweb界面模块:camunda-bpm-spring-boot-starter-webapp相关属性配置可参考Springboot集成配置。 关于工作流的介绍,我再此不进行赘述,网上有很多的资料。对于企业信息化的建设来说,工作流引擎基本上就是核心的业务,想要绕开基本上不可能。根据调研的结果来看,大的方向基本分成两派,一派是自己写流程引擎,对于一般的技术团队来说,这基本上不太可能,当然国内有几家再做,但是目前的使用效果来说,不是很好;另一派,则是集成开源的工作流引擎,就Java而言目前世界上比较认可的有三个项目,activiti、flowable、camunda。当然各有千秋,但就集成的难度来说,个人比较看好camunda,原因很简单,camund