UserManager>>
OSWorkflow在用户管理方面所提供的功能,主要包括用户的创建、群组的定义、用户验证、以及对step执行人的跟踪记录和执行权限的判断等等。
用户/群组的管理是由UserManager来完成的,它包含于一个单独的jar包内。我们可以这样使用UserManager:
UserManager um = UserManager.getInstance();
User test = um.createUser("test");
test.setPassword("test");
Group foos = um.createGroup("foos");
test.addToGroup(foos);
利用UserManager也可以实现用户验证功能:
UserManager um = UserManager.getInstance();
boolean authenticated = false;
authenticated = um.getUser(username).authenticate(password);
if (authenticated) {
session.setAttribute("username");
……
} else {
……
}
关于step执行人的跟踪,首先我们可以在创建流程的时候传入调用者(caller)名称,比如:
Workflow wf = new BasicWorkflow((String) session.getAttribute("username"));
BasicWorkflow会负责创建一个实现了WorkflowContext接口的实例,其中记录了caller的信息。利用com.opensymphony.workflow.util.Caller,可以将WorkflowContext中的caller随时植入transientVars中,以供后续的条件判断。为此,我们需要在流程定义文件中的适当位置加入如下定义(比如initial-actions中的pre-functions节点处):
<pre-functions>
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
</function>
</pre-functions>
Caller是一个FunctionProvider,其excute方法中包含了如下代码:
WorkflowContext context = (WorkflowContext) transientVars.get("context");
transientVars.put("caller", context.getCaller());
同时,我们还可以指定流程中某个step的执行人(owner),只需要在action的results节点处为其指定owner属性:
<step id="2″ name="Edit Doc">
<actions>
<action id="2″ name="Sign Up For Editing">
……
<results>
<unconditional-result old-status="Finished” status="Underway” step="2″ owner="${caller}"/>
</results>
利用caller和owner信息,我们可以在流程定义文件的condition节点中以多种形式指定限定条件,比如,利用脚本限定只允许caller为test的用户触发某结果:
<result old-status="Finished">
<condition type="beanshell">
<arg name="script">
propertySet.getString("caller").equals("test")
</arg>
</condition>
……
</result>
又比如,利用util包中的OSUserGroupCondition限定仅当caller为foos群组中的用户时,才触发action:
<action id="1″ name="Start Workflow">
……
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">foos</arg>
</condition>
再比如:利用util包中的AllowOwnerOnlyCondition限定仅当caller等于owner时,才触发action:
<action id="1″ name="Start Workflow">
……
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.AllowOwnerOnlyCondition</arg>
</condition>