问题描述
我编写了一个简单的javascript函数,该函数将屏蔽除代理商登录后四位数字以外的所有信用卡号,对于其他任何登录(管理员/经理),它将显示所有信用卡 位数(12),无需屏蔽。
我在这里面临两个问题:一个-无论代理商或经理的登录名如何,它对所有人都是掩盖的。另一个:掩码是这样,最后四位数字显示在前面,其余的数字显示为完整的空格,为了更好地理解,我同时提供了掩码的代码和屏幕截图。
// JavaScript source code
function RetrieveLoggedind365UserSecurityRoles(executionContext) {
var roleName = "Agent";
//will retrieve the credit Card Number from the form
var formContext = executionContext.getFormContext();
var creditCardNum = formContext.getAttribute("cts_creditcardnumber").getValue();
var duplicatecreditCardNum = creditCardNum;
//
//to retrive the global user context from the d365 security profile
var globalContext = Xrm.Utility.getGlobalContext();
var userRoles = globalContext.userSettings.roles;
//using regex it will mask the digits of credit card Numbers
userRoles.forEach(function hasRoleName(item) {
if (item.name == roleName) {
alert("i m in!!")
var replacedCreditCardNum = creditCardNum.replace(/\d(?=\d{4})/g,"x");
formContext.getAttribute("cts_creditcardnumber").setValue(replacedCreditCardNum);
};
if (item.name != rolename) {
formContext.getAttribute("cts_creditcardnumber").setValue(duplicatecreditCardNum);
};
}
);
}
对于所有登录名,它应该显示为“ xxxxx-xxxx-0123”及其掩码,无论代理或管理员如何
解决方法
您的代码有一个缺陷-两个if
语句都会在每个角色上执行并切换屏蔽,这就是行为使您感到困惑的原因。
您应该有一个标志并将其默认设置为false,然后进行迭代并检查-仅当在用户角色列表中返回了必要的角色时,才应将标志设置为true。
然后基于标志,您应该对其进行遮罩/取消遮罩。
(尽管这应该在服务器端本身完成,因为不能为部分屏蔽而不是在字段级完成安全性,而不是在客户端不这样做,这是避免在客户端代码中公开的最佳做法,也许检索/检索多个插件是一个选择权以牺牲性能影响为代价)
var userHasAccess = false;
userRoles.forEach(function hasRoleName(item) {
if (item.name == roleName) {
alert("I'm in!!")
userHasAccess = true;
};
});
if(userHasAccess == false){
var replacedCreditCardNum = creditCardNum.replace(/\d(?=\d{4})/g,"x");
formContext.getAttribute("cts_creditcardnumber").setValue(replacedCreditCardNum);
}
else{
formContext.getAttribute("cts_creditcardnumber").setValue(duplicatecreditCardNum);
}
对于正则表达式,我们一些online tester可以看到它的实际效果。