允许基于Meteor.user()属性的操作?

时间:2014-10-07 08:33:29

标签: javascript meteor

我想允许根据用户属性添加和删除我的Meteor集合。

这就是我设置管理员用户的方式:

if (Meteor.isServer) {

    if (Meteor.users.find().count() === 0) {

        Accounts.createUser({
        username:'Greg',
        password:'default',
        isAdmin: 1
        });

    }

}

我现在想让每个使用isAdmin = true的用户通过Accounts.createUser创建另一个用户:

Meteor.methods({
    makeUser: function(attributes) {
        var user = Meteor.user();
        if (user.isAdmin)
            Accounts.createUser(attributes)
        else
            console.log('User ' + user.username + ' created a player.')
    }  
})

永远不会创建用户,就好像user.isAdmin永远不等于true。我究竟做错了什么?这与发布和订阅有关吗?目前我仍然打开了自动发布。

2 个答案:

答案 0 :(得分:2)

将标记isAdmin添加到个人资料对象:

Accounts.createUser({
        username:'Greg',
        password:'default',
        profile:{
          isAdmin: 1
        }  
});

请参阅docs

Accounts.createUser方法允许仅向用户对象添加字段usernamepasswordemailprofile

Meteor.methods({
    makeUser: function(attributes) {
        var user = Meteor.user();
        if (user.profile && user.profile.isAdmin)
            Accounts.createUser(attributes)
        else
            console.log('User ' + user.username + ' created a player.')
    }  
})

更新

考虑使用包roles

答案 1 :(得分:0)

在这种情况下,普通用户仍然可以拨打Accounts.createUser并完全绕过您的makeUser来创建用户,我认为这不是您希望看到的行为。 我建议使用来自@Kuba Wyrobek的isAdmin逻辑来包装Accounts.onCreateUser

// server side
Accounts.onCreateUser(function(options, user) {
    user.profile = options.profile ? options.profile : {};
    if (user.profile && user.profile.isAdmin) {
        return user;
    } else {
        throw new Meteor.Error(403, "Forbbiden");
    }
});