我们正在尝试在 IBMWorklight 服务器上开发会话管理。以下是我们对会话管理系统的需求-
- 一旦每个用户使用他的凭据(用户名/密码)登录,就应该创建会话。
- 该会话应该能够存储该特定用户的会话数据,即会话应该保存他的凭据,以便他无需再次传递这些凭据以访问其他服务。
- 会话超时应在一定时间后发生。
我们的进步
在 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>
在 authenticationConfig 中创建登录模块:
<loginModule name="SimpleAuthLoginModule"> <className>com.worklight.core.auth.ext.NonValidatingLoginModule</className> </loginModule>
创建安全测试:
<customSecurityTest name="SimpleAuthAdapterTest"> <test realm="SimpleAuthRealm" isInternalUserID="true"/> </customSecurityTest>
我们创建了一个适配器,其中包含两个过程。以下是 adapter.xml 文件
<procedure name="requestForData" securityTest="SimpleAuthAdapterTest" /> <procedure name="requestForOtherData" securityTest="SimpleAuthAdapterTest" />
以下是适配器实现文件:
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"); }
我们创建了包括登录页面和主页的虚拟 UI。登录按钮单击将调用 submitAuthentication() 服务并迁移到主页。主页包含两个按钮,一个用于调用 requestForData() 服务,另一个用于 requestForOtherData() 服务。
我们面临的问题:
- 此流程要求首先调用受保护的服务,例如 requestForData,作为响应,worklight 服务器将抛出挑战,我们将通过提供用户凭证来清除这些挑战。我们需要其他方式,我们希望提供用户的凭据并启动会话,以便应该可以访问受该领域(安全测试)保护的所有服务。
- 一旦我们清除了第一个服务的挑战,我们就可以在不提供用户凭据的情况下调用其他服务,但是在调用下一个服务时,我们没有传递任何调用客户端的标识,这使我们相信在第一个服务调用挑战中建立的会话是对于所有/任何非特定用户的用户。我们需要非常非常用户特定的会话。
当我们正在开发银行移动应用程序时,请评论在 Worklight 中间件服务器上维护会话是否是个好主意。请在上面提出解决方案...