Springboot2.1.6集成activiti7出现登录验证的实现
⼀、问题
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 = NickName();
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.Id());
}
在单元测试中测试Activiti框架,出现如下的异常:
org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
at
org.springframework.security.access.dentialsNotFound(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 junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
at 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启动实例。
单元测试实例:
ample.demo;
import com.ruoyi.RuoYiApplication;
import ine.RuntimeService;
import ine.runtime.ProcessInstance;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.st.context.SpringBootTest;
import st.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(){
/**
hello spring是什么意思* 流程变量
*  给<userTask id="请假申请" name="请假申请" activiti:assignee="#{student}"></userTask>
*  的student赋值
*/
HashMap<String, Object> variables = new HashMap<>();
// String username = NickName();
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.Id());
}
}
结果打印:
流程实例启动:
b0af0810-4801-11eb-b1ac-005056c00001
可以看到使⽤⽼接⼝,就可以成功执⾏了。
相关⽂章:
到此这篇关于Springboot2.1.6集成activiti7出现登录验证的实现的⽂章就介绍到这了,更多相关Springboot activiti7登录验证内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。