1

現在、Worklight アプリケーションにアダプター・ベースの認証を実装しています。記録として、Worklight バージョン 5.0.6.1 を使用しています。

私がやりたいことは、ドキュメントでアドバイスされているように、認証アダプターの「ログアウト」機能でクリーンアップを実行することです。

したがって、Worklight フレームワークによって自動的に呼び出されるログアウト関数内で、ログアウトされるユーザーに関する情報を保持する userIdentity オブジェクトを取得したいと考えています。「WL.Server.getActiveUser()」を呼び出してこれを実現しようとしましたが、ログアウト機能でこれを行うことはできないようです。

ログに次の例外が表示されます (WebSphere App Server 7)。

[9/3/13 17:13:11:683 IST] 00000039 DataAccessSer 1        com.worklight.integration.services.impl.DataAccessServiceImpl invokeProcedureInternal Procedure 'onLogout' invocation failed. Runtime: Adapter 'onLogout' security test has no user realm.java.lang.RuntimeException: Adapter 'onLogout' security test has no user realm.

この背後にある考え方は、DB で何らかのクリーンアップを実行する外部 REST サービスを呼び出したいということであり、モバイル アプリケーションの userId をこのサービスのパラメーターとして渡す必要があります。

認証アダプターのログアウト機能内からログアウトされているユーザーの ID を取得するためのベスト プラクティスを教えてください。

ありがとう。

4

1 に答える 1

3

ユーザー ID は、Adapter.onLogout() が呼び出される前に、基礎となる認証フレームワークによって破棄されます。その結果、 Adapter.onLogout() が呼び出されると、ユーザー ID は存在しなくなります。したがって、 WL.Server.getActiveUser() は null を返すか、例外をスローします (この場合、ユーザー レルムが定義されていないため、これで問題ありません)。

基礎となる認証フレームワークがそれを破棄した後でも userIdentity からのデータが必要な場合 (これはあなたの場合です)、セッション状態で userIdentity を保存できます。ただし、手動でそこに保存しているため、必要がなくなったらワイプするのもあなたの責任であることを覚えておく必要があります。

したがって、アダプターコードは次のようになります。

/* global var, not inside of any function*/
var userIdentity = null;

function submitCredentials(user, pass){
    if (/*validate credentials*/){

        /* using previously created global var, not declaring it again */
        userIdentity = {
             userId:user,
             displayName:user
        };
        WL.Server.setActiveUser("realm", userIdentity);
    }
}

function onLogout(){
    /* do your stuff with userIdentity object and then wipe it*/
    userIdentity = null;
}

通常のアダプタ フローとの主な違いは、userIdentity オブジェクトが submitCredentials() 関数のスコープではなくグローバル変数として作成されるため、セッション スコープの変数であるということです。

于 2013-11-18T09:33:51.683 に答える