Management of users, groups and permissions is commonly known as identity management. jBPM includes an optional identity component that can be easily replaced by a company's own identity data store.
The jBPM identity management component includes knowledge of the organisational model. Task assignment is typically done with organisational knowledge. So this implies knowledge of an organisational model, describing the users, groups, systems and the relations between them. Optionally, permissions and roles can be included too in an organisational model. Various academic research attempts failed, proving that no generic organisational model can be created that fits every organisation.
The way jBPM handles this is by defining an actor as an actual
participant in a process. An actor is identified by its ID called an
actorId. jBPM has only knowledge about actorId's and they are represented
as java.lang.String
s for maximum flexibility. So any
knowledge about the organisational model and the structure of that data
is outside the scope of the jBPM core engine.
As an extension to jBPM we will provide (in the future) a component to manage that simple user-roles model. This many to many relation between users and roles is the same model as is defined in the J2EE and the servlet specs and it could serve as a starting point in new developments. People interested in contributing should check the jboss jbpm jira issue tracker for more details.
Note that the user-roles model as it is used in the servlet, ejb and portlet specifications, is not sufficiently powerful for handling task assignments. That model is a many-to-many relation between users and roles. This doesn't include information about the teams and the organisational structure of users involved in a process.
The classes in yellow are the relevant classes for the expression assignment handler that is discussed next.
A User
represents a user or a service. A
Group
is any kind of group of users.
Groups can be nested to model the relation
between a team, a business unit and the whole company. Groups have
a type to differentiate between the hierarchical groups and e.g.
haircolor groups. Membership
s represent the
many-to-many relation between users and groups. A membership can be
used to represent a position in a company. The name of the membership
can be used to indicate the role that the user fullfills in the
group.
The identity component comes with one implementation that evaluates an expression for the calculation of actors during assignment of tasks. Here's an example of using the assignment expression in a process definition:
<process-definition> ... <task-node name='a'> <task name='laundry'> <assignment expression='previous --> group(hierarchy) --> member(boss)' /> </task> <transition to='b' /> </task-node> ...
Syntax of the assignment expression is like this:
first-term --> next-term --> next-term --> ... --> next-term where first-term ::= previous | swimlane(swimlane-name) | variable(variable-name) | user(user-name) | group(group-name) and next-term ::= group(group-type) | member(role-name)
An expression is resolved from left to right. The first-term specifies
a User
or Group
in the identity model.
Subsequent terms calculate the next term from the intermediate user or
group.
previous
means the task is assigned to the current
authenticated actor. This means the actor that performed the previous step in
the process.
swimlane(swimlane-name)
means the user or group is taken
from the specified swimlane instance.
variable(variable-name)
means the user or group is taken
from the specified variable instance. The variable instance can contain a
java.lang.String
, in which case that user or group is fetched from
the identity component. Or the variable instance contains a User
or Group
object.
user(user-name)
means the given user is taken from the
identity component.
group(group-name)
means the given group is taken from the
identity component.
group(group-type)
gets the group for a user. Meaning that
previous terms must have resulted in a User
. It searches for the
the group with the given group-type in all the memberships for the user.
member(role-name)
gets the user that performs a given role
for a group. The previous terms must have resulted in a Group
.
This term searches for the user with a membership to the group for which the name
of the membership matches the given role-name.
When you want to use your own datasource for organisational information such as your company's user database or ldap system, you can just rip out the jBPM identity component. The only thing you need to do is make sure that you delete the line ...
<mapping resource="org/jbpm/identity/User.hbm.xml"/> <mapping resource="org/jbpm/identity/Group.hbm.xml"/> <mapping resource="org/jbpm/identity/Membership.hbm.xml"/>
from the hibernate.cfg.xml
The ExpressionAssignmentHandler
is dependent on the identity
component so you will not be able to use it as is. In case you want
to reuse the ExpressionAssignmentHandler
and bind it to your user data
store, you can extend from the ExpressionAssignmentHandler
and override
the method getExpressionSession
.
protected ExpressionSession getExpressionSession(AssignmentContext assignmentContext);