要利用jbpm实现工作流程处理,就避免不了权限处理。jbpm提供的数据库中提供了三个表,分别是:jbpm4_id_user、jbpm4_id_membership、jbpm4_id_group,能够实现简单的权限,但是这里并不能满足我们企业的实际需求。正常在企业软件中我们是要能够把不同的模块或者功能让不同的角色去使用。简单的来说就是实现不同身份的用户可以使用不同的功能。我这里实现的权限管理只能控制把不同的模块分配给不同的用户使用。因为如果要控制到功能,实现起来太麻烦了!
1、在jbpm数据库中添加额外2个表,分别是:jbpm_id_resource、jbpm_id_re_grounp_resource。分别代表资源表和资源--用户组关系表。在资源表中pid是关联到自身的一个外键列,代表该资源是否是一个模块,如果不为“0”,代表是一个功能。关系图如下:
2、利用hibernate反向生成工具生成设计权限操作的映射文件、pojo类以及数据访问类。
3、把各个映射文件中的set、关联对象的延迟加载设置为false并指定排序依据。其中一个文件的实例代码如下:
<set name="resources" lazy="false" inverse="true" order-by="id">
<key>
<column name="pid"></column>
</key>
<one-to-many class="com.tc.entity.JbpmIdResource"/>
</set>
4、修改JbpmIdResource类以及对应的映射文件添加自身的一对多关系,即:模块到资源的一对多关系
a)在JbpmIdResource添加Set集合并提供get、set方法。
b)在对应的映射文件中添加set标签
<set name="resources" lazy="false" inverse="true" order-by="id">
<key>
<column name="pid"></column>
</key>
<one-to-many class="com.tc.entity.JbpmIdResource"/>
</set>
5、由于这里使用现成的js代码生成树形菜单,所以要准备一个工具类用来生成符合js要求的字符串,代码如下:
package com.tc.toolit;
import java.util.Iterator;
import java.util.Set;
import com.tc.entity.JbpmIdResource;
public class GiveMenuToolit {
private StringBuffer sb=new StringBuffer();
/**
* @param args
*/
public String giveMenu(JbpmIdResource t) {
printName(t);
return sb.toString();
}
public StringBuffer printName(JbpmIdResource t){
sb.append("L"+t.getId()+" = theMenu.addChild(L0, '"+t.getResType()+"', '"+t.getResName()+"', '"+t.getResUrl()+"', '"+t.getResComment()+"');\r\n");
Set set=t.getResources();
for (Iterator iterator = set.iterator(); iterator.hasNext();) {
JbpmIdResource object = (JbpmIdResource) iterator.next();
sb.append("L"+object.getId()+" = theMenu.addChild(L"+t.getId()+", '"+object.getResType()+"', '"+object.getResName()+"', '"+object.getResUrl()+"', '"+object.getResComment()+"');\r\n");
Set s=object.getResources();
if(s.size()>0){
printName(object);
}
}
return sb;
}
}
6、在准备一个用于生成树形字符串的biz,该biz用来生成最后传递给js用来生成字符串的信息并在该biz中创建main方法来测试代码是否要求,代码如下:
package com.tc.biz;
import java.util.Iterator;
import java.util.Set;
import org.jbpm.api.RepositoryService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.tc.dao.Jbpm4IdUserDAO;
import com.tc.entity.Jbpm4IdMembership;
import com.tc.entity.Jbpm4IdUser;
import com.tc.entity.JbpmIdResource;
import com.tc.toolit.GiveMenuToolit;
public class GiveMenuBiz {
public String giveMenu(Jbpm4IdUser user){
String mes="";
if(user!=null){
GiveMenuToolit gmt=new GiveMenuToolit();
Set<Jbpm4IdMembership> membershops=user.getJbpm4IdMemberships();
for (Iterator iterator = membershops.iterator(); iterator.hasNext();) {
Jbpm4IdMembership membership = (Jbpm4IdMembership) iterator.next();
Set<JbpmIdResource> jrs=membership.getJbpm4IdGroup().getJbpmIdResources();
for (Iterator iterator2 = jrs.iterator(); iterator2.hasNext();) {
JbpmIdResource jbpmIdResource = (JbpmIdResource) iterator2
.next();
mes=gmt.giveMenu(jbpmIdResource);
}
}
//System.out.println(mes);
}
return mes;
}
public static void main(String[] args) {
Jbpm4IdUserDAO rs=(Jbpm4IdUserDAO)new ClassPathXmlApplicationContext("applicationContext.xml").getBean("Jbpm4IdUserDAO");
Jbpm4IdUser user=(Jbpm4IdUser)rs.findById("wang02").get(0);
System.out.println(new GiveMenuBiz().giveMenu(user));
}
}
7、创建登陆表单,用来提交登陆的用户信息,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'login.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="doLogin.action" method="post" >
用户名:<input name="user.id"/>