一、问题

Spring2.1.5集成activiti7.1.24时拜访要输出用户名和明码。

    @Autowired    private ProcessRuntime processRuntime;    /**     * 启动工作     */    @Test    void startProcess(){        /**         * 流程变量         *   给<userTask id="销假申请" name="销假申请" activiti:assignee="#{student}"></userTask>         *     的student赋值         */        HashMap<String, Object> variables = new HashMap<>();        // String username = SecurityUtils.getNickName();        String username = "小王";        variables.put("staff", username);        ProcessInstance processInstance = processRuntime.start(ProcessPayloadBuilder                .start()                .withProcessDefinitionKey("baoxiao")                .withName("报销测试")                //.withBusinessKey(id)                // .withVariable("deptLeader", join)                .withVariables(variables)                .build());        System.out.println(processInstance.getId());    }

在单元测试中测试Activiti框架,呈现如下的异样:

org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:379)    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:223)    at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:65)    ...    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)

其余的形式大家如果试过胜利就能够了,如果不行,可试下这个:勾销登录验证如下:

@SpringBootApplication(        exclude = {                org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,                org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class        })

这是我在他人那找来的,困了我好长时间,晓得看到这个货色。

二、新版验证

其实这个都很简略,然而我看了不少博客下的评论都说依照这个形式剔除了,然而还是不行

An Authentication object was not found in the SecurityContext

当咱们自信的对着接口发动申请的时候,报了浏览器呈现了500,控制台报出下面的异样,中文意思:在SecurityContext中没有找到身份验证对象

why? 我明明曾经剔除了啊,为什么还是要验证身份?

到底是哪里出了问题?想不明确!

如果上下面的问题,你只须要应用,老的API即可,因为新封装的API应用SpringSecurity,所以须要身份验证

留神:以下均是集体了解,如有谬误,还请斧正

其实,当咱们应用Activiti7的时候,要晓得Activit7的开发团队,不在是之前Tom Baeyens的团队负责开发,也就是上面这个哥们。

Activiti7中,从新封装了一些新的API,比方ProcessRuntime和TaskRuntime

既然是新封装的,那肯定和老的API会有所区别,那具体区别在哪里呢?

咱们能够间接查看这两个接口外面的内容,去一探到底!

    @Autowired    private ProcessRuntime processRuntime;

我这里拿ProcessRuntime举例,咱们能够间接查看下,找到实现的类

或者间接应用快捷键CTRL + H,找出实现的类

进入实现类中:

进入实现类中,咱们能够看到类下面应用:

@PreAuthorize("hasRole('ACTIVITI_USER')")

这个是什么?

SpringSecurity用来在办法调用前或者调用后进行权限查看

说到这里,您应该明确了吧!因为Activiti7中封装进去的新接口,都加了这个注解,所以当咱们即便照着最开始的办法剔除了,依然还会呈现身份认证问题!

那为什么咱们调用老的接口,却不须要身份验证呢,其实不必开源码就能够推出,老的接口上并没有增加该注解

咱们能够看看老的接口 RuntimeService 的实现类:

    @Autowired    private RuntimeService runtimeService;

所以,咱们能够应用 RuntimeService 来代替 ProcessRuntime 启动实例。

单元测试实例:

package com.example.demo;import com.ruoyi.RuoYiApplication;import org.activiti.engine.RuntimeService;import org.activiti.engine.runtime.ProcessInstance;import org.junit.jupiter.api.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import java.util.HashMap;@RunWith(SpringRunner.class)@SpringBootTest(classes = RuoYiApplication.class)public class DemoApplicationTests {    // Activiti7 新接口因为内置SpringSecurity,在运行时会报错    // @Autowired    // private ProcessRuntime processRuntime;    // 老的接口办法,未内置 SpringSecurity    @Autowired    private RuntimeService runtimeService;    @Test    void contextLoads() {        System.out.println("hello world");    }    /**     * 在应用 SpringBoot + Activiti 时,启动服务拜访模块时,浏览器会弹出一个登录界面。     *     * 这是因为Activiti 框架整合了SpringSecurity框架,如果咱们不须要平安验证时能够禁用springsecurity。     *     *     * @SpringBootApplication(     *         exclude = {     *                 org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,     *                 org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class     *         })     */    /**     * 启动工作     */    @Test    void startProcess(){        /**         * 流程变量         *   给<userTask id="销假申请" name="销假申请" activiti:assignee="#{student}"></userTask>         *     的student赋值         */        HashMap<String, Object> variables = new HashMap<>();        // String username = SecurityUtils.getNickName();        String username = "小王";        variables.put("staff", username);        /*        ProcessInstance processInstance = processRuntime.start(ProcessPayloadBuilder                .start()                .withProcessDefinitionKey("baoxiao")                .withName("报销测试")                //.withBusinessKey(id)                // .withVariable("deptLeader", join)                .withVariables(variables)                .build());         */        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("baoxiao", variables);        System.out.println("流程实例启动:");        System.out.println(processInstance.getId());    }}

后果打印:

流程实例启动:b0af0810-4801-11eb-b1ac-005056c00001

能够看到应用老接口,就能够胜利执行了。


相干文章:
SpringBoot2.x整合Activiti7后,禁用SpringBootSecurity问题