如何兑现Meteor中的用户隐私设置

时间:2015-01-26 16:54:50

标签: meteor publish privacy

我有一组用户定义如下:

Accounts.createUser({
    username:'Simon', 
    email:'simon@email.com', 

    profile:{
        firstname:'Simon',
        lastname:'Surname',
        location:'Home Address',

        privacy: {
            location:0,
            emails:0 } //Location and emails are private and should not be disclosed
    }
});

我的问题是如何考虑个人资料隐私设置,为其他用户发布此用户的记录。在此示例中,我已将位置和电子邮件的隐私设置为零,目的是不为此用户发布此信息。

我想使用标准方法发布它:

Meteor.publish("usersWithPublicEmails", function () {
    return Meteor.users.find();
});

但我看不到以这样的方式指定选择器或字段的方法,即只发布公共信息。

我尝试添加以下格式的其他出版物:

Meteor.publish("allUsers", function () {
    return Meteor.users.find( {}, {fields:{username:1}} );
});

Meteor.publish("usersWithPublicEmails", function () {
    return Meteor.users.find( {"profile.privacy.emails":1}, {fields:{username:1, emails:1}} );
});

但是选择器似乎没有像我预期的那样返回电子邮件。我正在从性能的角度寻找最佳方法。

3 个答案:

答案 0 :(得分:0)

Mongodb不是关系数据库,因此每当我想基于元数据加入或查询时,我记得我必须以不同的方式做事。在您的情况下,如果我想查询用户隐私,我会为用户隐私制作单独的集合。另外,如果我关心性能,我可能永远不会想要"所有x",我只是想要足以向用户展示,从而分页。考虑到这两个想法,您可以轻松获得所需内容:根据隐私设置和性能进行查询。

Privacy = new Mongo.Collection("privacy");

每当我们想为帐户添加隐私时:

Privacy.insert({
  emails: 1,
  userId: account._id,
});

然后,一次一页,每页显示10个结果,跟currentPage进行跟踪:

Meteor.publish("usersWithPublicEmails function (currentPage) {
    var results = []
    var privacyResults = Privacy.find({"emails":1}, {skip: currentPage,  
        limit: 10});
    var result;
    while (privacyResults.hasNext() ) {
       result = privacyResult.next();
       results.append(Meteor.users.find({_id: result.userId});
    }
    return result;
});

我没有测试这段代码,它可能有错误,但它应该给你一般的想法。这里的缺点是您必须保持隐私和用户同步,但这些是您在不使用关系数据库时遇到的问题。

Mongodb有一种方法可以用更少的代码进行这种参考查找,但它仍然按需发生,我更喜欢自己动手做的灵活性。如果您有兴趣,请查看Database references

答案 1 :(得分:0)

那是因为您的发布功能fields对象中有拼写错误,而不是email您输入了emails

所以正确的功能是:

Meteor.publish("usersWithPublicEmails", function () {
    return Meteor.users.find( {"profile.privacy.emails":1}, {fields:{username:1, email:1}} );
});

此外,您已经在allUsers出版物中发布了所有用户名,因此,为了为相关的公共用户添加缺失的数据,您只需要需要这个:

Meteor.publish("usersWithPublicEmails", function () {
    return Meteor.users.find( {"profile.privacy.emails":1}, {fields:{email:1}} );
});

并且Meteor会自动为您合并这些记录。

答案 2 :(得分:0)

最终的简单解决方案。我错过了路由器中的额外订阅:

Router.route('/users', {

    name: 'userList',

    waitOn: function(){
        return Meteor.subscribe('allUsers') &&
               Meteor.subscribe('usersWithPublicEmails');
    },

    data: function(){
        return Meteor.users.find();
    }
});

一个基本错误: - (