所以这是我目前遇到麻烦的情况。
我想通过一个功能来检查用户是否有权查看页面。
所以我有一个带有键/值的数组,其中我存储了权限。
{"authorities":[{"role":"gebruikersbeheer"},{"role":"kijken"},{"role":"plannen"}]};
存储在service.currentUser
中,可以使用service.currentUser.authorities
调用。
我有一个功能:
hasPermission: function (permission) {
var role = { "role" : permission };
for(perm in service.currentUser.authorities)
{
var test = service.currentUser.authorities[perm];
if(test === role)
{
return (!!(service.currentUser) && true);
}
}
return false;
}
我创建了test
变量来调试它的值。 permission
参数的值为'gebruikersbeheer'。
现在我想将perm
键的值与role
进行比较,并检查它是否为真。
现在我已经在互联网上搜索了这个,我只找到了对我来说不可行但也无法实现的解决方案。
当我开始调试时,perm
有一个整数值。为什么不是钥匙的名字? (必须是“角色”)
此外,当我在role
和test
变量上使用Watch时,它们完全相同但仍然无法比较它们并获得true
。
(不要介意此时的退货声明。) 我也无法修改数组。它以这种方式由春季安全返回。
有没有(更好的)方法来检查authorities
是否包含role
?
它可能重复,但我无法找到适合我具体情况的任何内容。
干杯。
答案 0 :(得分:2)
您目前正在检查具有另一个对象的对象,最好检查带有字符串的字符串,下面显示了相同函数的一个小例子,但是使用了数组中的 some 方法;
var currentUser = {"authorities":[{"role":"gebruikersbeheer"},{"role":"kijken"},{"role":"plannen"}]};
function hasPermission(permission) {
return currentUser.authorities.some(function(v){
return v.role === permission;
});
}
alert("Have permission? "+ hasPermission("gebruikersbeheer"))

答案 1 :(得分:1)
service.currentUser.authorities
是一个数组,这就是为什么你在perm
中得到for(perm in service.currentUser.authorities)
的整数。
另一个问题是您无法使用===
(包括原型属性)比较对象中的所有属性,因此您需要明确比较属性的值...或创建自定义函数比较你的对象。
您可以尝试:
hasPermission: function (permission) {
var role = { "role" : permission };
for(perm in service.currentUser.authorities)
{
var test = service.currentUser.authorities[perm];
if(test["role"] === role["role"])
{
return (!!(service.currentUser) && true);
}
}
return false;
}
希望这有帮助,
答案 2 :(得分:0)
由于您只关心某些事物是否存在,您可以使用Array.Some功能。它仍然循环遍历数组,但是在击中第一个为true的实例时将停止。你的方法基本上已经做了同样的事情,但这样它有点干净,因为它使用了数组的实际元素(而不是索引)。
hasPermission: function (permission) {
var authArray = service.currentUser.authorities;
var hasAuth = authArray.some(function(kvp) {
return kvp.role == permission; //function to determine a match
});
return hasAuth;
}