I’m trying to write some code that will be run by the ‘admin’ user that will check out a document to a different user e.g. ‘John’. However, when I view the checked out document in Share it always says that the document is checked out to the user ‘admin’.
I’m running this code on Alfresco 4.0.c
Here is the code that I am executing
Boolean rtn = AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Boolean>() {
@Override
public Boolean doWork() throws Exception {
// executes the following code as user who had the document previously checked out
CheckOutCheckInService checkOutCheckInService = serviceRegistry.getCheckOutCheckInService();
//this line is debug code to check who the current user is according to the AuthenticationService
//AuthenticationService authService = serviceRegistry.getAuthenticationService();
//if (log.isDebugEnabled()) log.debug("Current UserName in AuthenticationService is '" + authService.getCurrentUserName() + "'.");
NodeRef checkedOutCopy = checkOutCheckInService.checkout(nodeRef);
ContentWriter writer = fileFolderService.getWriter(checkedOutCopy);
writer.putContent(workingCopyContentAndMetadata.getContentFile());
if (log.isDebugEnabled()) log.debug("Have uploaded working copy document as user '" + String.valueOf(workingCopyOwner) + "'.");
return true;
}
}, String.valueOf(workingCopyOwner));
From looking at the Alfresco source code, the checkOutcheckInService gets the username to check-out the document to from the AuthenticationService getCurrentUserName() method. However, it appears that the AuthenticationUtil.runAs code does not change the user in the AuthenticationService.
Am I doing something wrong here or how can I do this correctly?
Thanks in advance.
The problem you are running into is that the services provided by the Registry Interface will not allow you to change the current user in the system. To do this you need to pull in the AuthenticationComponent, preserve the current user, change the current user, and then bring back the original user.
This is the same method suggested here, which will allow you to run as a system user in Alfresco.
To give a brief example:
Add the Authentication Component the same way you’re bringing in the registry, make sure to expose a setter for Spring injection:
Now you can call the method to set the current user:
Calling the AuthenticationService.getCurrentUserName() will now properly display the current user. Don’t forget that you will need to add a reference to the bean in your *-context.xml before restarting.
In the -context.xml for you class:
Best of luck!