Activiti7 与 Spring Boot 及 Spring Security 整合 踩坑记录

您所在的位置:网站首页 springsecurity整合ldap Activiti7 与 Spring Boot 及 Spring Security 整合 踩坑记录

Activiti7 与 Spring Boot 及 Spring Security 整合 踩坑记录

2024-07-12 06:06| 来源: 网络整理| 查看: 265

1.  前言

实话实说,网上关于Activiti的教程千篇一律,有参考价值的不多。很多都是老早以前写的,基本都是直接照搬官方提供的示例,要么就是用单元测试跑一下,要么排除Spring Security,很少有看到一个完整的项目。太难了,笔者在实操的时候,遇到很多坑,在此做一个记录。

其实,选择用Activiti7没别的原因,就是因为穷。但凡是有钱,谁还用开源版的啊,当然是用商业版啦。国外的工作流引擎没有考虑中国的实际情况,很多像回退、委派、撤销等等功能都没有,所以最省事的还是中国特色的BPM。

Activiti7的文档比较少,但是教程多。Flowable的文档比较齐全,但是网上教程少。

2.  Maven依赖

4.0.0 org.springframework.boot spring-boot-starter-parent 2.5.2 com.cjs.example demo-activiti7 0.0.1-SNAPSHOT demo-activiti7 1.8 org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-web org.activiti activiti-spring-boot-starter 7.1.0.M6 mysql mysql-connector-java runtime org.projectlombok lombok true org.apache.commons commons-lang3 3.12.0 org.apache.commons commons-collections4 4.4 commons-io commons-io 2.10.0 io.jsonwebtoken jjwt 0.9.1 com.alibaba fastjson 1.2.76 org.springframework.boot spring-boot-maven-plugin org.projectlombok lombok

配置 application.properties

server.port=8080 server.servlet.context-path=/activiti7 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true spring.datasource.username=root spring.datasource.password=123456 spring.jpa.database=mysql spring.jpa.open-in-view=true spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true spring.jpa.show-sql=true spring.redis.host=192.168.28.31 spring.redis.port=6379 spring.redis.password=123456 spring.redis.database=1 spring.activiti.database-schema-update=true spring.activiti.db-history-used=true spring.activiti.history-level=full spring.activiti.check-process-definitions=false spring.activiti.deployment-mode=never-fail

代码是最好的老师,查看代码所有配置项都一目了然

这里最好关闭自动部署,不然每次项目启动的时候就会自动部署一次

3.  集成 Spring Security

详见我另一篇 《基于 Spring Security 的前后端分离的权限控制系统》 

3.1.  实体类

权限

package com.cjs.example.entity; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.io.Serializable; import java.util.Set; /** * 菜单表 * @Author ChengJianSheng * @Date 2021/6/12 */ @Setter @Getter @Entity @Table(name = "sys_menu") public class SysMenuEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Integer id; /** * 资源编码 */ @Column(name = "code") private String code; /** * 资源名称 */ @Column(name = "name") private String name; /** * 菜单/按钮URL */ @Column(name = "url") private String url; /** * 资源类型(1:菜单,2:按钮) */ @Column(name = "type") private Integer type; /** * 父级菜单ID */ @Column(name = "pid") private Integer pid; /** * 排序号 */ @Column(name = "sort") private Integer sort; @ManyToMany(mappedBy = "menus") private Set roles; }

角色

package com.cjs.example.entity; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.io.Serializable; import java.util.Set; /** * 角色表 * @Author ChengJianSheng * @Date 2021/6/12 */ @Setter @Getter @Entity @Table(name = "sys_role") public class SysRoleEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Integer id; /** * 角色名称 */ @Column(name = "name") private String name; @ManyToMany(mappedBy = "roles") private Set users; @ManyToMany @JoinTable(name = "sys_role_menu", joinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "menu_id", referencedColumnName = "id")}) private Set menus; @ManyToMany @JoinTable(name = "sys_dept_role", joinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "dept_id", referencedColumnName = "id")}) private Set depts; } 

部门 

package com.cjs.example.entity; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.io.Serializable; import java.util.Set; /** * 部门表 * @Author ChengJianSheng * @Date 2021/6/12 */ @Setter @Getter @Entity @Table(name = "sys_dept") public class SysDeptEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Integer id; /** * 部门名称 */ @Column(name = "name") private String name; /** * 父级部门ID */ @Column(name = "pid") private Integer pid; /** * 组对应的角色 */ @ManyToMany(mappedBy = "depts") private Set roles; } 

用户

package com.cjs.example.entity; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.io.Serializable; import java.time.LocalDate; import java.util.Set; /** * 用户表 * @Author ChengJianSheng * @Date 2021/6/12 */ @Setter @Getter @Entity @Table(name = "sys_user") public class SysUserEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Integer id; @Column(name = "username") private String username; @Column(name = "password") private String password; @Column(name = "mobile") private String mobile; @Column(name = "enabled") private Integer enabled; @Column(name = "create_time") private LocalDate createTime; @Column(name = "update_time") private LocalDate updateTime; @OneToOne @JoinColumn(name = "dept_id") private SysDeptEntity dept; @ManyToMany @JoinTable(name = "sys_user_role", joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")}) private Set roles; }

3.2.  自定义 UserDetailsService

package com.cjs.example.domain; import lombok.Setter; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import java.util.Collection; import java.util.Set; /** * @Author ChengJianSheng * @Date 2021/6/12 * @see User * @see User */ @Setter public class MyUserDetails implements UserDetails { private String username; private String password; private boolean enabled; private Set authorities; public MyUserDetails(String username, String password, boolean enabled, Set authorities) { this.username = username; this.password = password; this.enabled = enabled; this.authorities = authorities; } @Override public Collection


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3