Activiti7 与 Spring Boot 及 Spring Security 整合 踩坑记录 |
您所在的位置:网站首页 › springsecurity整合ldap › Activiti7 与 Spring Boot 及 Spring Security 整合 踩坑记录 |
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 |