Authentication is the process of knowing on who's behalf the code is running. In case of jBPM this information should be made available from the environment to jBPM. Cause jBPM is always executed in a specific environment like a webapp, an EJB, a swing application or some other environment, it is always the surrounding environment that should perform authentication.
In a few situations, jBPM needs to know who is running the code. E.g. to add authentication information in the process logs to know who did what and when. Another example is calculation of an actor based on the current authenticated actor.
In each situation where jBPM needs to know who is running the code, the 
    central method org.jbpm.security.Authentication.getAuthenticatedActorId()
    is called.  That method will delegate to an implementation of 
    org.jbpm.security.authenticator.Authenticator.  By specifying an
    implementation of the authenticator, you can configure how jBPM retrieves the currently
    authenticated actor from the environment.
    
The default authenticator is 
    org.jbpm.security.authenticator.JbpmDefaultAuthenticator.
    That implementation will maintain a ThreadLocal stack of authenticated 
    actorId's.  Authenticated blocks can be marked with the methods 
    JbpmDefaultAuthenticator.pushAuthenticatedActorId(String) and 
    JbpmDefaultAuthenticator.popAuthenticatedActorId().  Be sure to always 
    put these demarcations in a try-finally block.  For the push and pop methods of this 
    authenticator implementation, there are convenience methods supplied on the base 
    Authentication class.  The reason that the JbpmDefaultAuthenticator maintains a stack
    of actorIds instead of just one actorId is simple: it allows the jBPM code to distinct
    between code that is executed on behalf of the user and code that is executed on behalf of 
    the jbpm engine.
See the javadocs for more information.