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

作者:Corwien 时间:2022-08-03 10:44:48 

一、问题

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的团队负责开发,也就是下面这个哥们。

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

Activiti7中,重新封装了一些新的API,比如ProcessRuntime和TaskRuntime

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

我们可以直接查看这两个接口里面的内容,去一探究竟!


@Autowired
 private ProcessRuntime processRuntime;

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

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

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

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

进入实现类中:

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

进入实现类中,我们可以看到类上面使用:


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

这个是什么?

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

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

那为什么我们调用老的接口,却不需要身份验证呢,其实不用开源码就可以推出,老的接口上并没有添加该注解

我们可以看看老的接口 RuntimeService 的实现类:


 @Autowired
 private RuntimeService runtimeService;

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

所以,我们可以使用 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问题

来源:https://segmentfault.com/a/1190000038676438

标签:Springboot,activiti7,登录验证
0
投稿

猜你喜欢

  • Java 信号量Semaphore的实现

    2023-06-19 11:00:34
  • 详解Spring boot/Spring 统一错误处理方案的使用

    2023-11-24 12:56:07
  • SpringCloud hystrix断路器与局部降级全面介绍

    2023-10-28 17:29:11
  • Java 自定义注解的魅力

    2023-06-29 14:45:15
  • 浅谈Java的虚拟机结构以及虚拟机内存的优化

    2021-12-01 21:59:49
  • springboot项目启动的时候参数无效的解决

    2022-09-03 14:50:29
  • C#怎样才能将XML文件导入SQL Server

    2022-02-16 17:51:13
  • Java实战之在线租房系统的实现

    2022-09-29 04:44:18
  • springboot配置redis过程详解

    2022-10-13 12:41:30
  • Java String转换时为null的解决方法

    2022-08-25 08:16:00
  • SpringBoot @Validated注解实现参数分组校验的方法实例

    2023-01-02 11:18:50
  • Java Mybatis框架增删查改与核心配置详解流程与用法

    2022-07-08 10:47:20
  • Jmeter如何添加循环控制器

    2021-06-26 20:09:52
  • Springmvc ResponseBody响应json数据实现过程

    2022-06-12 15:22:30
  • SpringBoot 静态资源导入及首页设置问题

    2023-11-26 22:45:07
  • java并发编程专题(五)----详解(JUC)ReentrantLock

    2023-12-01 04:04:09
  • Unity键盘WASD实现物体移动

    2021-06-14 13:46:21
  • SpringMVC执行过程详细讲解

    2023-06-07 10:04:54
  • Maven install 报错"程序包不存在"问题的解决方法

    2021-05-27 06:08:06
  • C# DataGridView绑定数据源的方法

    2023-06-30 00:26:39
  • asp之家 软件编程 m.aspxhome.com