Springboot2.1.6集成 activiti7 出现登陆验证

1、问题

Spring2.1.5集成activiti7.1.24时访问要输入用户名和密码。java

@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框架,出现以下的异常:spring

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)

其他的方式你们若是试过成功就能够了,若是不行,可试下这个:取消登陆验证以下:api

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

这是我在别人那找来的,困了我好长时间,知道看到这个东西。浏览器

2、新版验证

其实这个都很简单,可是我看了很多博客下的评论都说按照这个方式剔除了,可是仍是不行安全

An Authentication object was not found in the SecurityContext

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

why? 我明明已经剔除了啊,为何仍是要验证身份?单元测试

究竟是哪里出了问题?想不明白!测试

若是上上面的问题,你只须要使用,老的API便可,由于新封装的API使用SpringSecurity,因此须要身份验证ui

注意:如下均是我的理解,若有错误,还请指正spa

其实,当咱们使用Activiti7的时候,要知道Activit7的开发团队,不在是以前Tom Baeyens的团队负责开发,也就是下面这个哥们。

image.png

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

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

咱们能够直接查看这两个接口里面的内容,去一探究竟!

@Autowired
    private ProcessRuntime processRuntime;

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

image.png

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

image.png

进入实现类中:
image.png

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

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

这个是什么?

SpringSecurity用来在方法调用前或者调用后进行权限检查

说到这里,您应该明白了吧!由于Activiti7中封装出来的新接口,都加了这个注解,因此当咱们即便照着最开始的方法剔除了,仍然还会出现身份认证问题!

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

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

@Autowired
    private RuntimeService runtimeService;

image.png

因此,咱们能够使用 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问题

相关文章
相关标签/搜索