时间:2021-05-20
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 = runtimeService.startProcessInstanceByKey("baoxiao", variables); System.out.println("流程实例启动:"); System.out.println(processInstance.getId()); }}结果打印:
流程实例启动:
b0af0810-4801-11eb-b1ac-005056c00001
可以看到使用老接口,就可以成功执行了。
相关文章:
SpringBoot2.x整合Activiti7后,禁用SpringBootSecurity问题
到此这篇关于Springboot2.1.6集成activiti7出现登录验证的实现的文章就介绍到这了,更多相关Springboot activiti7登录验证内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
SpringBoot集成activiti基础环境搭建添加依赖org.activitiactiviti-spring-boot-starter-basic6.0.
TurboC2.0集成环境1.5TurboC2.0集成环境TurboC2.0是美国Borland公司开发的一个C语言集成环境,它集编辑、编译、连接及运行功能于一
ipada1822是ipad第五代,即ipadair,其屏幕尺寸为9.7英寸。GPU方面A7集成四核心PowerVRG6430,A7也是首款集成此核心的CPU,
SQLServer2005是一个全面的数据库平台,使用集成的商业智能(BI)工具提供了企业级的数据管理。有位win7系统用户安装SQLServer2005出现错
高通骁龙710比高通骁龙675性能强,从手机CPU集成的GPU规格对比来看,骁龙710集成的Adreno616,比骁龙675集成的Adreno612要更高,因此