检查MFP V8.0中是否已登录用户

时间:2016-08-08 19:44:44

标签: ibm-mobilefirst mobilefirst-adapters

我在MFP V8.0中编写了一个适配器程序。通过安全检查确保此过程。我想在调用此适配器过程之前检查用户是否已登录:

过程映射到范围如下:

<procedure name="searchData" scope="restrictedResource"/>

安全检查定义如下:

<securityCheckDefinition name="UserValidationSecurityCheck" class="com.sample.UserValidationSecurityCheck">

我已经完成了服务器的范围元素映射。

我在下面写了调用适配器方法的方法:

function callAdapterProcedure(invocationData){
    var procedureName = invocationData.procedure;
    var successHandler = invocationData.successHandler;
    var failureHandler = invocationData.failureHandler;
    var parameters = invocationData.parameters;

    var isuserLoggedIn = checkForLoggedInUser();
    alert('is logged in' + isuserLoggedIn);
    if(isuserLoggedIn){
        var dataRequest = new WLResourceRequest(getAdapterPath(procedureName), WLResourceRequest.GET);
        dataRequest.setQueryParameter("params", [JSON.stringify(parameters)]);
        dataRequest.send().then(successHandler,failureHandler);
    }else{
        hideProgressBar();
        showAlert(Messages.ALERT_SESSION_TIME_OUT);
        logoutWithoutConfirmation();
        openLogin();
    }
}

以下是checkForLoggedInUser()方法的实现:

function checkForLoggedInUser(){
    var userAlreadyLoggedIn = undefined;//WL.Client.isUserAuthenticated(mrmGlobal.realms.authenticationRealm,null);
    WLAuthorizationManager.obtainAccessToken("restrictedResource").then(
        function (accessToken) {
            alert("obtainAccessToken onSuccess");
            userAlreadyLoggedIn = true;
        },
        function (response) {
            alert("obtainAccessToken onFailure: " + JSON.stringify(response));
            userAlreadyLoggedIn = false;
    });

    return userAlreadyLoggedIn;
}

我知道WLAuthorizationManager.obtainAccessToken将异步调用发送到服务器,这就是为什么userAlreadyLoggedIn始终为undefined的原因。在进行适配器调用之前,有什么方法可以检查用户会话是否超时?基本上我想实现像WL.Client.isUserAuthenticated这样的东西(早期版本就有)。

- 更新 -

另外我还观察到WLAuthorizationManager.obtainAccessToken的处理程序方法还没有被调用的另一件事。

1 个答案:

答案 0 :(得分:5)

从你的代码:

- (void)textFieldDidEndEditing:(UITextField *)textField
{
_txtBaseUrl.hidden = YES;

}

认为 WLAuthorizationManager.obtainAccessToken("restrictedResource").then( function (accessToken) { alert("obtainAccessToken onSuccess"); userAlreadyLoggedIn = true; }, function (response) { alert("obtainAccessToken onFailure: " + JSON.stringify(response)); userAlreadyLoggedIn = false; }); 表示用户未登录是一种常见的误解。但这并不完全是如何运作的。

当您致电obtainAccessToken's onFailure时,有3种可能的结果:

  • 成功:用户已登录,并且obtainAccessToken被调用(以及挑战处理程序的成功方法)。
  • 挑战:用户未登录,安全检查向客户端发送了质询。 挑战处理程序将接收此挑战。在您回答挑战之前,obtainAccessToken onSuccess将一直处于暂停状态。这可能是您的情况发生的情况,这无法解释为什么没有任何获取的处理程序被调用。
  • 失败:验证过程中出错了。可能是服务器已关闭,网络问题,范围不存在,或用户被阻止等。在这种情况下,将调用obtain

目前没有API可以检查是否在不触发质询的情况下授予范围。我已经打开了一个内部功能请求,随时可以提交您自己的(https://www.ibm.com/developerworks/rfe)。

与此同时,您可以添加自己的内部布尔标志,每次登录时都设置为true,每当您注销时都设置为false。

相关问题