3

I would like to have some publications that only return the items a user has access to based on their role. I am using the alanning:roles package to handle the roles.

For instance, I have a publication like:

Meteor.publish('header_fields', function() {
    console.log("header_fields: %j", this.userId);
    if (Roles.userIsInRole(this.userId,['ADMIN','INSPECTOR'])) {
        // Inspectors and Admins can see all header fields
        return HeaderFields.find();
    } else {
        // Clients should only be able to see header fields for forms they have access to
        var user = Meteor.users.find({_id: this.userId});
        var formIds = [];
        _.each(Forms.find({client_id: user.profile.client_id}).fetch(), function(form) {
            this.push(form._id);
        }, formIds);
        return HeaderFields.find({form_id: {$in: formIds}});
    }
});

The problem I am having is that, in all the examples I have seen, publications are defined in a .js file in the server folder, and thus run and get when the client first connects. However, the user isn't logged in when the client first connects initially. But, I don't know where to put these publications or how it should work.

4

1 に答える 1

3

Meteor は、公式ドキュメントを引用して、デフォルトでこの特定のユースケースをエレガントな方法で処理します。

this.userId

パブリッシュ機能内にアクセスします。ログインしているユーザーの ID、またはログインしているユーザーがいない場合は null。これは定数です。ただし、ログインしているユーザーが変更された場合、発行機能は新しい値で再実行されます。

http://docs.meteor.com/#publish_userId

したがって、基本的には、例のように異なるドキュメントを返すパブリケーションをクライアントでサブスクライブした場合this.userId、すべてがそのままで機能することを意味します!

于 2014-10-03T00:54:02.887 に答える