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

2022-07-25,,,,

一、问题

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

到此这篇关于springboot2.1.6集成activiti7出现登录验证的实现的文章就介绍到这了,更多相关springboot activiti7登录验证内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

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

下载本文的Word格式文档,以方便收藏与打印。