Springboot2.1.6集成activiti7出现登录验证的实现

网友投稿 275 2023-02-11

Springboot2.1.6集成activiti7出现登录验证的实现

一、问题

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

@Autowired

private ProcessRuntime processRuntime;

/**

* 启动任务

*/

@Test

void startProcess(){

/**

* 流程变量

* 给

* 的student赋值

*/

HashMap 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.AbstractzzGzzdiSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:379)

at org.shttp://pringframework.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(){

/**

* 流程变量

* 给

* 的student赋值

*/

HashMap 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问题

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Springboot 跨域配置无效及接口访问报错的解决方法
下一篇:聚合数据网站制作(聚合客户端)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~