掩盖信用卡号并显示以更正已登录人的身份未显示

问题描述

我编写了一个简单的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”及其掩码,无论代理或管理员如何

enter image description here

解决方法

您的代码有一个缺陷-两个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可以看到它的实际效果。