springboot整合activiti7
1.新建spring boot项目,添加依赖
<dependency> <groupId>org.activitigroupId> <artifactId>activiti-spring-boot-starterartifactId>//acti <version>7.1.0.M6version> dependency>
<dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>5.1.47version> dependency>
<dependency> <groupId>org.activitigroupId> <artifactId>activiti-image-generatorartifactId> <version>5.22.0version> dependency>
2.resources下新建文件夹processes,并添加bpmn文件
3.yml配置
spring: activiti: database-schema-update: true # 对所有表更新操作, 如不存在则创建 db-history-used: true # 使用历史表 history-level: full # 保存历史数据的最高级别 check-process-definitions: true # 校验流程文件
4.增加配置类
activiti7默认集成了spring security框架,所以需要配置spring security
1和2两个类是从activiti官网的案例项目里的,这里附上链接 https://github.com/Activiti/activiti-examples
主要是配置了两个用户
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @Configuration public class DemoApplicationConfiguration { private Logger logger = LoggerFactory.getLogger(DemoApplicationConfiguration.class); @Bean public UserDetailsService myUserDetailsService() { InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager(); String[][] usersGroupsAndRoles = { {"system", "password", "ROLE_ACTIVITI_USER"}, {"admin", "password", "ROLE_ACTIVITI_ADMIN"}, }; for (String[] user : usersGroupsAndRoles) { ListauthoritiesStrings = Arrays.asList(Arrays.copyOfRange(user, 2, user.length)); logger.info("> Registering new user: " + user[0] + " with the following Authorities[" + authoritiesStrings + "]"); inMemoryUserDetailsManager.createUser(new User(user[0], passwordEncoder().encode(user[1]), authoritiesStrings.stream().map(s -> new SimpleGrantedAuthority(s)).collect(Collectors.toList()))); } return inMemoryUserDetailsManager; } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
进行登陆的操作
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextImpl; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Component; import java.util.Collection; @Component public class SecurityUtil { private Logger logger = LoggerFactory.getLogger(SecurityUtil.class); @Autowired private UserDetailsService userDetailsService; public void logInAs(String username) { UserDetails user = userDetailsService.loadUserByUsername(username); if (user == null) { throw new IllegalStateException("User " + username + " doesn't exist, please provide a valid user"); } logger.info("> Logged in as: " + username); SecurityContextHolder.setContext(new SecurityContextImpl(new Authentication() { @Override public Collection<? extends GrantedAuthority> getAuthorities() { return user.getAuthorities(); } @Override public Object getCredentials() { return user.getPassword(); } @Override public Object getDetails() { return user; } @Override public Object getPrincipal() { return user; } @Override public boolean isAuthenticated() { return true; } @Override public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { } @Override public String getName() { return user.getUsername(); } })); org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username); } }
启动类,在启动项目的时候进行登录,然后注入了一个DatasSource
@SpringBootApplication public class ActivitiApplication implements CommandLineRunner { @Autowired private SecurityUtil securityUtil; public static void main(String[] args) { SpringApplication.run(ActivitiApplication.class, args); } @Override public void run(String... args) throws Exception { securityUtil.logInAs("system"); } @Bean public DataSource dataSource() { DataSource dataSource = new DriverManagerDataSource("jdbc:mysql:///activiti?useUnicode=true&characterEncoding=utf8", "root", "root"); return dataSource; } }
5.启动项目,可以看到数据库已经创建了表
项目启动时,在processes文件夹中的流程文件会自动部署,可以查看数据库直接启动流程,接下来的操作和activiti6的操作就相同了。
可以看到activiti7的id使用的是uuid