来源:http://hi.baidu.com/pluto_andy/blog/item/8f74c20b4a5c061695ca6b39.html
在osworkflow的example.xml中,可以看到这样的配置:
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">foos</arg>
</condition>
这是一个条件语句,意思是:判断当前执行改流程的用户在不在group组(foos是组的名字)中,是执行什么流程,不是执行什么流程。
那在实际开发中如何应用这个组呢?这就要用到osuser.xml配置文件。
<opensymphony-user>
<!--数据储存在内存中-->
<provider class="com.opensymphony.user.provider.memory.MemoryAccessProvider" />
<provider class="com.opensymphony.user.provider.memory.MemoryCredentialsProvider" />
<provider class="com.opensymphony.user.provider.memory.MemoryProfileProvider" />
<!--数据持久化到数据库中-->
<provider class="com.opensymphony.user.provider.jdbc.JDBCAccessProvider">
<property name="user.table">eruser</property>
<property name="group.table">role</property>
<property name="membership.table">user_role</property>
<property name="user.name">usid</property>
<property name="user.password">loginpwd</property>
<property name="group.name">roleid</property>
<property name="membership.userName">ur_userid</property>
<property name="membership.groupName">ur_roleid</property>
<property name="datasource">java:comp/env/jdbc/sqlserver</property>
</provider>
<provider class="com.opensymphony.user.provider.jdbc.JDBCCredentialsProvider">
<property name="user.table">eruser</property>
<property name="group.table">role</property>
<property name="membership.table">user_role</property>
<property name="user.name">usid</property>
<property name="user.password">loginpwd</property>
<property name="group.name">roleid</property>
<property name="membership.userName">ur_userid</property>
<property name="membership.groupName">ur_roleid</property>
<property name="datasource">java:comp/env/jdbc/sqlserver</property>
</provider>
<provider class="com.opensymphony.user.provider.jdbc.JDBCProfileProvider">
<property name="user.table">eruser</property>
<property name="group.table">role</property>
<property name="membership.table">user_role</property>
<property name="user.name">usid</property>
<property name="user.password">loginpwd</property>
<property name="group.name">roleid</property>
<property name="membership.userName">ur_userid</property>
<property name="membership.groupName">ur_roleid</property>
<property name="datasource">java:comp/env/jdbc/sqlserver</property>
</provider>
<authenticator class="com.opensymphony.user.authenticator.SmartAuthenticator"/>
</opensymphony-user>
简要的说明一下改配置文件:
当数据存储在内存中时,不用做什么配置。要持久化到数据库中,就要配置数据库连接池了。
property name="datasource">java:comp/env/jdbc/sqlserver</property>
这条语句就是对连接池的调用。
在osworkflow中主要有三个类对group进行操作:
User、Group、UserManager
user对应相应的用户表,Group对应相应的组表,两表是多对多的关系。有个中间表维护两种表。
UserManager的作用就是管理用户和组以及两者之间的关系。
------------------------------------------具体应用代码--------------------------------------------
UserManager um = UserManager.getInstance(); //
com.opensymphony.user.User test = null;
test = um.createUser("test"); //新建用户test
foos = um.createGroup("haha");//新建用户haha
test.addToGroup(foos); //将test添加到haha组中
//程序执行流程时,会执行OSUserGroupCondition
public class OSUserGroupCondition implements Condition {
//~ Methods
public boolean passesCondition(Map transientVars, Map args, PropertySet ps) {
try {
WorkflowContext context = (WorkflowContext) transientVars.get("context");
User user = UserManager.getInstance().getUser(context.getCaller());
return user.inGroup((String) args.get("group"));
} catch (EntityNotFoundException e) {
return false;
}
}
}
更改源文件JDBCAccessProvider类中inGroup方法的sql语句