使用基于 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 适配器的身份验证

IBM Worklight 6.1.0.1,基于 2 个适配器的身份验证出现问题

IBM Worklight:基于适配器的身份验证成功后未获得响应

需要 Worklight 适配器身份验证

IBM Worklight 6.0 - 如果客户端注销/登录,具有基本身份验证的适配器不会更新身份验证标头

IBM Worklight 6.1 - 任何实现基于 SSO 的身份验证的参考资料?