使用基于 Worklight 适配器的身份验证时如何获取正在注销的用户的 userIdentity
Posted
技术标签:
【中文标题】使用基于 Worklight 适配器的身份验证时如何获取正在注销的用户的 userIdentity【英文标题】:How to get the userIdentity of the user being logged out when using Worklight adapter based authentication 【发布时间】:2013-09-03 16:22:09 【问题描述】:我目前正在为我的 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.
这背后的想法是我想调用一个外部 REST 服务,该服务将在数据库中执行一些清理工作,并且我需要将移动应用程序 userId 作为该服务的参数传递。
有人可以提供一些最佳实践,以便从身份验证适配器注销功能中检索正在注销的用户的身份吗?
谢谢。
【问题讨论】:
【参考方案1】:在调用 Adapter.onLogout() 之前,底层身份验证框架会破坏用户身份。结果,当调用 Adapter.onLogout() 时,用户身份不再存在。因此 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() 函数的范围内创建的,而是作为全局变量创建的,因此它是会话范围的 var。
【讨论】:
谢谢安东!在您的 cmets 之前,我不知道每个经过身份验证的用户都有一个唯一的适配器实例。 不仅经过身份验证。每个会话,无论其身份验证状态如何,都有自己的适配器实例。以上是关于使用基于 Worklight 适配器的身份验证时如何获取正在注销的用户的 userIdentity的主要内容,如果未能解决你的问题,请参考以下文章
IBM Worklight 6.1.0.1,基于 2 个适配器的身份验证出现问题
IBM Worklight:基于适配器的身份验证成功后未获得响应