我在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
的处理程序方法还没有被调用的另一件事。
答案 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。