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.

这背后的想法是我想调用一个外部 REST 服务,该服务将在数据库中执行一些清理,并且我需要将移动应用程序 userId 作为该服务的参数传递。

有人可以提供一些最佳实践,以检索从身份验证适配器注销功能内部注销的用户的身份吗?

谢谢。

4

1 回答 1

3

在调用 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。

于 2013-11-18T09:33:51.683 回答