0

我们正在尝试在 IBMWorklight 服务器上开发会话管理。以下是我们对会话管理系统的需求-

  1. 一旦每个用户使用他的凭据(用户名/密码)登录,就应该创建会话。
  2. 该会话应该能够存储该特定用户的会话数据,即会话应该保存他的凭据,以便他无需再次传递这些凭据以访问其他服务。
  3. 会话超时应在一定时间后发生。

我们的进步

  1. 在 authenticationConfig 中创建了一个领域:

    <realm name="SimpleAuthRealm" loginModule="SimpleAuthLoginModule">
        <className>com.worklight.integration.auth.AdapterAuthenticator</className>
        <parameter name="login-function" value="SimpleAuthAdapter.onAuthRequired" />
        <parameter name="logout-function" value="SimpleAuthAdapter.onLogout" />
    </realm>
    
  2. 在 authenticationConfig 中创建登录模块:

    <loginModule name="SimpleAuthLoginModule">
                <className>com.worklight.core.auth.ext.NonValidatingLoginModule</className>
            </loginModule>
    
  3. 创建安全测试:

    <customSecurityTest name="SimpleAuthAdapterTest">
                   <test realm="SimpleAuthRealm" isInternalUserID="true"/>
               </customSecurityTest>
    
  4. 我们创建了一个适配器,其中包含两个过程。以下是 adapter.xml 文件

     <procedure name="requestForData" securityTest="SimpleAuthAdapterTest" />
    <procedure name="requestForOtherData" securityTest="SimpleAuthAdapterTest" />
    
  5. 以下是适配器实现文件:

     function onAuthRequired(headers, errorMessage) {
        WL.Logger.info("onAuthRequired(headers, errorMessage)----> START");
        WL.Logger.info("headers: " + JSON.stringify(headers));
        WL.Logger.info("errorMessage: " + errorMessage);
    
        errorMessage = errorMessage ? errorMessage : null;
    
        WL.Logger.info("onAuthRequired(headers, errorMessage)----> STOP");
        return {
            authRequired : true,
            errorMessage : errorMessage
        };
    }
    
    function submitAuthentication(username, password) {
    
        WL.Logger.info("submitAuthentication(username, password)----> START");
        WL.Logger.info("username: " + username);
        WL.Logger.info("password: " + password);
    
        if (username === "worklight" && password === "worklight") {
    
            WL.Logger.info("Login successfull");
    
            var userIdentity = {
                userId : username,
                displayName : username,
    
            };
    
            WL.Server.setActiveUser("SimpleAuthRealm", userIdentity);
    
            var response = {
                authRequired : false,
                errorMessage : ""
            };
    
            WL.Logger.info("submitAuthentication(username, password)----> STOP");
            WL.Logger.info("response: " + JSON.stringify(response));
    
            return response;
        }
    
        var response = {
            authRequired : true,
            errorMessage : "Invalid login credentials"
        };
    
        WL.Logger.info("submitAuthentication(username, password)----> STOP");
        WL.Logger.info("response: " + JSON.stringify(response));
        return response;
    }
    function onLogout() {
    
        WL.Logger.info("onLogout()---->START");
        WL.Server.setActiveUser("SimpleAuthRealm", null);
    
        //WL.Client.logout('SimpleAuthRealm');
        WL.Logger.info("onLogout()---->STOP");
    }
    
  6. 我们创建了包括登录页面和主页的虚拟 UI。登录按钮单击将调用 submitAuthentication() 服务并迁移到主页。主页包含两个按钮,一个用于调用 requestForData() 服务,另一个用于 requestForOtherData() 服务。

我们面临的问题:

  1. 此流程要求首先调用受保护的服务,例如 requestForData,作为响应,worklight 服务器将抛出挑战,我们将通过提供用户凭证来清除这些挑战。我们需要其他方式,我们希望提供用户的凭据并启动会话,以便应该可以访问受该领域(安全测试)保护的所有服务。
  2. 一旦我们清除了第一个服务的挑战,我们就可以在不提供用户凭据的情况下调用其他服务,但是在调用下一个服务时,我们没有传递任何调用客户端的标识,这使我们相信在第一个服务调用挑战中建立的会话是对于所有/任何非特定用户的用户。我们需要非常非常用户特定的会话。

当我们正在开发银行移动应用程序时,请评论在 Worklight 中间件服务器上维护会话是否是个好主意。请在上面提出解决方案...

4

1 回答 1

2

对于#1,考虑在所有应用程序环境(在应用程序描述符中)设置安全测试并在应用程序启动时调用 WL.Client.connect(无论如何您都应该这样做)这将在应用程序最初联系 Worklight 时触发身份验证服务器。完成此操作后,您将能够访问同一领域中受安全测试保护的适配器,而无需额外挑战。

对于 #2,当您建立到 Worklight 服务器的连接时,您创建了一个服务器跟踪的会话,因此即使您不再提供凭证,Worklight 服务器也知道哪个经过身份验证的用户进行了每个适配器调用。

于 2014-09-03T02:55:22.527 回答