1

「管理者」ユーザーによって実行されるコードを作成しようとしています。このコードは、ドキュメントを別のユーザー (「ジョン」など) にチェックアウトします。ただし、チェックアウトしたドキュメントを共有で表示すると、常にドキュメントがユーザー「admin」にチェックアウトされていると表示されます。このコードを Alfresco 4.0.c で実行しています

これが私が実行しているコードです

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));

Alfresco ソース コードを見ると、checkOutcheckInService は AuthenticationService getCurrentUserName() メソッドからドキュメントをチェックアウトするためのユーザー名を取得します。ただし、AuthenticationUtil.runAs コードは AuthenticationService のユーザーを変更しないようです。

ここで何か間違ったことをしていますか、どうすればこれを正しく行うことができますか?

前もって感謝します。

4

1 に答える 1

2

あなたが直面している問題は、Registry Interface によって提供されるサービスでは、システム内の現在のユーザーを変更できないことです。これを行うには、AuthenticationComponent を取り込み、現在のユーザーを保持し、現在のユーザーを変更してから、元のユーザーに戻す必要があります。

これは、ここで提案されている方法と同じで、Alfresco でシステム ユーザーとして実行できます。

簡単な例を挙げると:

レジストリに取り込むのと同じ方法で認証コンポーネントを追加し、Spring インジェクションのセッターを公開してください。

private AuthenticationComponent authComponent;

//for Spring injection
public void setAuthenticationComponent(AuthenticationComponent authComponent) {
    this.authComponent = authComponent;
}

これで、メソッドを呼び出して現在のユーザーを設定できます。

    authComponent.setCurrentUser(username);

AuthenticationService.getCurrentUserName() を呼び出すと、現在のユーザーが正しく表示されるようになりました。再起動する前に、*-context.xml に Bean への参照を追加する必要があることを忘れないでください。

-context.xml for you クラス:

    property name="authenticationComponent" ref="AuthenticationComponent" 

頑張ってください!

于 2012-04-19T18:29:22.853 に答える