我正在构建一个身份验证系统,而且我几乎完成了所有事情。我根据用户角色陷入了授权。如果我使用数字,例如user.role> 1,传递,如果不是,则返回false,我可以使其正常工作。
但是我打算转到基于阵列的角色,所以我可以创建'模块'并做出更好的控制。
这一切都从数据库返回开始,如果user / pass正常,DB将返回一个包含用户名,id和角色的json数组,如下所示:
{
id: 1,
name: 'John Doe',
role: ['user', 'order', 'service']
}
在我的$州,我的定义如下:
.state('home', {
[...code...]
data: {
requireLogin: true,
role: ['user']
}
})
.state('sales', {
[...code...]
data: {
requireLogin: true,
role: ['sales', 'admin']
}
})
.state('order', {
[...code...]
data: {
requireLogin: true,
role: ['order', 'admin']
}
})
例如,该用户应该能够访问状态'命令'和' home',因为至少有一个角色是.state数据角色。但我在工厂内验证时遇到了麻烦。我有点做了,但有时会返回一些其他未经考虑的数字,或者至少我不知道正确的验证。
这是我的工厂:
//token = user data returned from data base;
//type = user role from state;
var _getTipo = function(token, type) {
var authUser = token.indexOf(type);
return authUser;
};
有时候我会得到-1,10或2 ..
我做错了什么?或者是否有正确的方法来检查至少有一个用户角色是否处于州角色?
答案 0 :(得分:1)
每当我进行用户身份验证时,我都会使用指令作为这样的属性:
app.directive('permissions', function (currentUser) {
return {
restrict: 'A',
priority: 100000,
scope: false,
link: function (scope, element, attr) {
var accessDenied = true;
var attribute = attr.permissions;
if (currentUser.role.indexOf(attribute) !== -1) {
accessDenied = false;
}
if (accessDenied) {
element.children().remove();
element.remove();
}
}
};
});
然后你会这样称呼它:
<div permissions="user">
//info
</div>
您只需要将currentUser对象传递给指令即可。或者你可以改变你的工厂:
var _getTipo = function(token, type) {
var authenticated = false
for(var i = 0;i < token.role.length;i++){
var userRole = token.role[i];
for(var x = 0;x < type.length;x++){
var stateRole = type[x];
if (userRole == stateRole) {
authenticated = true;
}
}
}
return authenticated;
};
要将此字符串:“['user','sales']”转换为数组:
JAVASCRIPT
var string = "['user', 'sales']";
var array = string.replace('"[',"").replace(']"',"").split("', '");
PHP
$string = "['user', 'sales']";
$string = str_replace('"[',"",$string);
$string = str_replace(']"',"",$string);
$array = explode("', '",$string);