欢迎转载,转载请注明出处,谢谢
这一篇博客接着以前的JBPM写,很不好意思,中间间隔了那么久,实在是有的忙了,或许我自己太懒了,见谅,哈哈.....
之前两篇简单讲了下JBPM的环境搭建,由于前段时间项目也用到了JBPM,所以今天我们回顾一下JBPM与业务系统的用户,权限集成的问题。
首先,我们要搞明白为什么把JBPM的用户体系集成到自己的业务系统,也就是抛弃JBPM自己的用户体系,稍有研究的同学肯定也小得JBPM自带的用户权限太简单了,就只有三张表,而且字段也过于简单。
在集成之前我们先回顾下JBPM自己的用户体系,它一共有三张表,jbpm4_id_user,jbpm4_id_group,jbpm4_id_membership,也就是用户表,组表,用户与组关系表,那么想要集成,在我们业务系统里面肯定得有与这三张表类似的表,用户表业务系统肯定有(你懂的),组这个表业务系统不一定有,但是考虑到业务系统一般都有角色表,那么我们是不是可以把角色当作组,答案是肯定的,我接下来要讲的也就是这样子的,组与用户的关系表就不说了,有角色表的话,关系也肯定有。
表的问题解决了,我们要做的第一步就是让我们业务系统的User实体实现JBPM的User接口:
/** *用户实体表 *已实现org.jbpm.api.identity.User接口,与JBPM公用用户对象 */ @Entity @Table(name = "T_USER") public class User extends BaseEntity implements org.jbpm.api.identity.User {
实现该接口后,由于org.jbpm.api.identity.User里有个方法
public String getId();
一般来说我们的User实体id都是int型的,但是接口里的都是String型的,所以这个要做个转换
@Override public String getId() { return id.toString(); }
同时setId方法也要改一点点:
public void setId(String id) { this.id = NumberUtils.toInt(id); }
同时Role这个实体也要实现JBPM的Group接口:
/** *角色实体类 *已实现org.jbpm.api.identity.Group接口,与JBPM公用用户组概念 *@author LuoYu */ @Entity @Table(name = "T_ROLE") public class Role extends BaseEntity implements Group
Role里面的id问题与User一样,做一点点修改,这里不再赘述.
值得得注意的是:既然我们修改了JBPM用户,组的指向,那么之前JBPM自带的创建用户,组等方法肯定不好使,我们得重写这些方法,怎么重写?JBPM其实也提供了一个接口来做这个事情,IdentitySession。
我们需要创建一个类来实现该接口,下面的我系统里的相关代码:
/** * 自定义的JBPM,identitySession引擎 * 继承JBPM的IdentitySession接口,以实现外挂配餐系统自己的用户系统 * @author LuoYu */ @Service @Component(value = "sessionService") public class JbpmSessionEngine implements IdentitySession { @Autowired private IBaseDao baseDao; @Override public String createGroup(String groupName, String groupType, String groupParentId) { Role role = new Role(); role.setRoleName(groupName); return (String) this.baseDao.save(role); } public void createMembership(String userId,String groupId){ UserRole userRole = new UserRole(); com.tlj.pcxt.entity.admin.User user = new com.tlj.pcxt.entity.admin.User(); user.setId(userId); userRole.setUser(user); Role role = new Role(); role.setId(groupId); this.baseDao.save(userRole); } @Override public void deleteGroup(String groupId) { } @Override public void deleteMembership(String userId, String groupId, String role) { } @Override public Group findGroupById(String groupId) { return (Group) this.baseDao.getObjectByID(Role.class, NumberUtils.toInt(groupId)); } /** * 通过userId查询所在的用户组 *@author LuoYu *@date 2013-4-25 *@param arg *@return String */ @SuppressWarnings("unchecked") @Override public List<Group> findGroupsByUser(String userId) { String hql = "select o.role from UserRole o where o.user.id = "+NumberUtils.toInt(userId); return (List<Group>) this.baseDao.getObjectList(hql); } @Override public User findUserById(String userId) { Object obj = this.baseDao.getObjectByID(com.tlj.pcxt.entity.admin.User.class, NumberUtils.toInt(userId)); if(obj!=null){ return (User)obj; } return new UserImpl(); } @SuppressWarnings("unchecked") @Override public List<User> findUsers() { return (List<User>)this.baseDao.getAllObjects(com.tlj.pcxt.entity.admin.User.class); } public com.tlj.pcxt.entity.admin.User getUserById(String userId){ return (com.tlj.pcxt.entity.admin.User) this.baseDao.getObjectByID(com.tlj.pcxt.entity.admin.User.class, Integer.parseInt(userId)); } @Override public List<User> findUsersByGroup(String groupId) { return null; } /** * 通过用户组id查询下属所有用户 *@author LuoYu *@date 2013-4-25 *@param arg *@return String */ @SuppressWarnings("unchecked") public List<com.tlj.pcxt.entity.admin.User> getUsersByGroup(String groupId){ String hql = "select o.user from UserRole o where o.role.id="+NumberUtils.toInt(groupId); List<com.tlj.pcxt.entity.admin.User> list = (List<com.tlj.pcxt.entity.admin.User>) baseDao.getObjectList(hql); return list; } @SuppressWarnings("unchecked") public List<ProcessDefinitionInfo> getAllDeployDefinition(){ List<ProcessDefinitionInfo> list = new ArrayList<ProcessDefinitionInfo>(); String hql = "from ProcessDefinitionInfo o where o.isDelete=0"; list = (List<ProcessDefinitionInfo>) this.baseDao.getObjectList(hql); return list; } public void saveProcessDefinitionInfo(ProcessDefinitionInfo processDefinitionInfo){ this.baseDao.save(processDefinitionInfo); } @SuppressWarnings("unchecked") public ListVo<ProcessInfo> getAllProcessInstance(Map<String, Object> paramMap){ ListVo<ProcessInfo> listVo = new ListVo<ProcessInfo>(); List<ProcessInfo> list = new ArrayList<ProcessInfo>(); StringBuffer hqlList = new StringBuffer(); StringBuffer hqlCount = new StringBuffer(); Map<Object, Object> map = new HashMap<Object, Object>(); int start = NumberUtils.toInt((String) paramMap.get("start")); int limit = NumberUtils.toInt((String) paramMap.get("limit")); String status = (String) paramMap.get("status"); hqlList.append("select w from ProcessInfo w where w.isDelete=0 "); hqlCount.append("select count(w.id) from ProcessInfo w where w.isDelete=0 "); if(!StringUtils.isBlank(status)){ hqlList.append("and w.status = :status "); hqlCount.append("and w.status = :status "); map.put("status", status); } hqlList.append("order by w.status asc,w.createDate desc"); list = (List<ProcessInfo>) this.baseDao.findPageByQuery(start, limit, hqlList.toString(), map); int count = this.baseDao.getTotalCount(hqlCount.toString(), map); listVo.setList(list); listVo.setTotalSize(count); return listVo; } public void deleteDefinition(String ids) { this.baseDao.delete(ProcessDefinitionInfo.class, ids); } @SuppressWarnings("unchecked") public String getDefinitionIdByObjectName(String name){ String sql = "select j.DEPLOYMENT_ from jbpm4_deployprop j where j.OBJNAME_ = '"+name+"' and j.KEY_ = 'pdid'"; List<Object> list = (List<Object>) this.baseDao.getObjectsByNativeSql(sql); if(list!=null){ return list.get(0).toString(); } return null; } public IBaseDao getBaseDao() { return baseDao; } public void setBaseDao(IBaseDao baseDao) { this.baseDao = baseDao; } @Override public String createUser(String s, String s1, String s2, String s3) { return null; } @Override public List<User> findUsersById(String... as) { return null; } @Override public void deleteUser(String s) { } @Override public List<Group> findGroupsByUserAndGroupType(String s, String s1) { return null; } @Override public void createMembership(String s, String s1, String s2) { } }
这里面需要实现的方法很多,自己斟酌,重写你需要用到的方法即可。
这些步骤完成之后,再回家最初的配置,找到jbpm.cfg.xml,在里面添加如下代码,用来指向我们刚刚创建的类
<transaction-context> <hibernate-session current="true" /> <Object class="com.tlj.pcxt.service.jbpm.identity.JbpmSessionEngine" /> </transaction-context>
完成这一步,基本上就属于万事具备,只欠东风了
在我们需要用到jbpm的地方,注入我们刚刚创建的service,任务JBPM操作都通过我们刚刚创建的类提供的方法来完成!
好了,以上就是把JBPM的用户体系集成自己业务系统的所有过程,,欢迎拍砖!