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

Check if user is already logged in or or not in MFP V8.0

我在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 的处理程序方法也没有被调用。

来自您的代码:

 WLAuthorizationManager.obtainAccessToken("restrictedResource").then(
        function (accessToken) {
            alert("obtainAccessToken onSuccess");
            userAlreadyLoggedIn = true;
        },
        function (response) {
            alert("obtainAccessToken onFailure: " + JSON.stringify(response));
            userAlreadyLoggedIn = false;
    });

认为 obtainAccessToken's onFailure 表示用户未登录是一种常见的误解。但事实并非如此。

当您调用 obtainAccessToken 时,有 3 种可能的结果:

  • 成功:用户登录,obtainAccessToken onSuccess 被调用(连同质询处理程序的成功方法)。
  • 挑战:用户未登录,安全检查向客户端发送了挑战。 您的挑战处理者将收到此挑战。 obtain 将保持等待状态,直到您回答挑战。 这可能是您的情况,这无法解释为什么 none 的 obtain 处理程序被调用。
  • 失败:身份验证过程中出现问题。可能是服务器宕机、网络问题、作用域不存在、用户被屏蔽等。在这种情况下,将调用obtainAccessToken's onFailure

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

同时,您可以添加自己的内部布尔标志,在您登录时设置为 true,在注销时设置为 false。