共计 4546 个字符,预计需要花费 12 分钟才能阅读完成。
一、问题
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 问题