很多时候,JBPM自己提供的用户系统是不够用的,这时候就要求我们自己去扩展自己的用户体系,如使用角色来区分用户的权限。JBPM允许外挂一个用户体系。这时我们需要修改一些配置,如下:
一、修改spring-jbpm4.cfg.xml(该文件在配置Spring文件时引入的)。
1、注释<import resource="jbpm.identity.cfg.xml" />
2、增加如下代码:
<transaction-context> <hibernate-session current="true"/> <object class="jbpm.service.IMyJbpmServiceImpl"/> </transaction-context>
说明:此步操作是为了让JBPM操作时,调用自己编写的方法,其中jbpm.service.IMyJbpmServiceImpl为我们自己编写的service代码。
二、 建立IMyJbpmServiceImpl类
该类需要实现org.jbpm.pvm.internal.identity.spi.IdentitySession接口。并重写里面的方法,本人测试时使用的方法为findGroupsByUser,所以只重写了该方法。
注:在编写的过程中,如果需要使用我们自己定义的接口,则获得接口的方法与通过Spring注入时获得的方法不同,需要使用EnvironmentImpl.getFromCurrent方法获得。
如:
private IUserRightService userRightService = EnvironmentImpl.getFromCurrent(IUserRightService.class);
三、 重写findGroupsByUser方法:
重写时,需要将你自己的分组对应的类实现org.jbpm.api.identity.Group接口,如:我测试时使用的为Role类,则将此类实现Group接口,在findGroupsByUser方法中直接返回查找出来的Role信息。
也可以不需要实现Group接口,直接将你自己查找出的分组信息封装到JBPM的Group中去。
如:
public List<Group> findGroupsByUser(String arg0) {
List<TRole> list = new ArrayList<TRole>();
try {
list = userRightService.findRoleByUserId(Integer.parseInt(arg0));
}catch (Exception e) {
e.printStackTrace();
}
List<Group> gList = new ArrayList<Group>();
for(final TRole r : list){
if(r == null){
continue;
}
Group g = new Group() {
@Override
public String getType() {
return null;
}
@Override
public String getName() {
return r.getName();
}
@Override
public String getId() {
return r.getId().toString();
}
};
gList.add(g);
}
return gList;
}
如此配置后,调用List<Task> taskList = taskService.findGroupTasks(user.getId().toString());时,系统则会执行上面重写的方法。