我正在使用一个使用node.js web服务的http适配器来验证用户名和密码。
过程authenticatePatient和authenticateDoctor是不受保护的,因此我将在其他过程中使用安全性测试。
但是,当我试图调用其中一个时,也会调用质询处理程序,尽管事实上它们是不受保护的,如果我删除了质询处理程序,它运行正常!
PatientAuthRealmChallengeHandler.js
var patientAuthRealmChallengeHandler = WL.Client.createChallengeHandler("PatientAuthRealm");
patientAuthRealmChallengeHandler.isCustomResponse= function(response){
if(!response|| !response.responseJSON || response.responseText===null){
return false;
}
if(typeof (response.responseJSON.authRequired)!== 'undefined'){
return true;
}
else {
return false;
}
}
patientAuthRealmChallengeHandler.handleChallenge = function(response){
var authRequired = response.responseJSON.authRequired;
if(authRequired==true){
console.log("accées réfusé!!");
}
else if(authRequired==false){
console.log(" déja authentifié ");
patientAuthRealmChallengeHandler.submitSuccess();
}
}
Authentication.xml
<procedure name="authenticatePatient" securityTest="wl_unprotected"/>
<procedure name="authenticateDoctor" securityTest="wl_unprotected"/>
Authentication-impl.js(只是authenticatePatient函数)
function authenticatePatient(params){
var url="/patient/authenticate";
var response= callWS(url,params,"post");
var size= response.patients.length;
if(size!=0){
userIdentity = {
userId: params.username,
displayName: params.username,
attributes: {
}
};
//WL.Server.setActiveUser("PatientAuthRealm", null);
WL.Server.setActiveUser("PatientAuthRealm", userIdentity); // create session
return {
authRequired: false,
"response": response
};
}
return onAuthRequired(null, "Invalid login credentials");
}
function onAuthRequired(headers, errorMessage){
errorMessage = errorMessage ? errorMessage : null;
return {
authRequired: true,
errorMessage: errorMessage
};
}
function onLogout(){
WL.Logger.debug("Logged out");
}
authentificationConfig.xml(领域)
<realm name="PatientAuthRealm" loginModule="PatientAuthLoginModule">
<className>com.worklight.integration.auth.AdapterAuthenticator </className>
<parameter name="login-function" value="authentication.onAuthRequired"/>
<parameter name="logout-function" value="authentication.onLogout"/>
</realm>
<realm name="DoctorAuthRealm" loginModule="DoctorAuthLoginModule">
<className>com.worklight.integration.auth.AdapterAuthenticator </className>
<parameter name="login-function" value="authentication.onAuthRequired"/>
<parameter name="logout-function" value="authentication.onLogout"/>
</realm>
authentificationConfig.xml(LoginModule)
<loginModule name="PatientAuthLoginModule">
<className>com.worklight.core.auth.ext.NonValidatingLoginModule</className>
</loginModule>
<loginModule name="DoctorAuthLoginModule">
<className>com.worklight.core.auth.ext.NonValidatingLoginModule</className>
</loginModule>
authentificationConfig.xml(安全测试)
<customSecurityTest name="authenticatePatient">
<test isInternalUserID="true" realm="PatientAuthRealm"/>
</customSecurityTest>
<customSecurityTest name="authenticateDoctor">
<test isInternalUserID="true" realm="DoctorAuthRealm"/>
</customSecurityTest>
答案 0 :(得分:1)
重要的是要记住,任何http响应都可以调用函数isCustomResponse
,而不仅仅是受保护的请求。此函数(isCustomResponse
)的工作是确定此特定响应是否与此质询处理程序相关。
根据我在您的示例中所理解的,您向未受保护的authenticatePatient
发出请求
然后,authenticatePatient
返回:
return {
authRequired: false,
"response": response
};
此JSON对象将发送到客户端。
您的isCustomResponse
函数被触发(它不会检查这是否是受保护的请求,它会在每次响应时触发)。
isCustomResponse
的实施应该足够聪明,以确定是否忽略此响应(return false;
),或触发质询处理程序(return true;
)。
对于您的实现,您似乎只检查response.responseJSON.authRequired
是否已定义。您没有检查其值是true
还是false
。这意味着,您的代码确定此响应需要由质询处理程序处理。
我建议您更改isCustomResponse
的实施,以检查response.responseJSON.authRequired
的值,并仅在true
为authRequired
时返回true
。