AngularJs检查用户角色是否与状态角色匹配进行身份验证

时间:2015-11-15 00:56:03

标签: angularjs

我正在构建一个身份验证系统,而且我几乎完成了所有事情。我根据用户角色陷入了授权。如果我使用数字,例如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 ..

我做错了什么?或者是否有正确的方法来检查至少有一个用户角色是否处于州角色?

1 个答案:

答案 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);