1

我正在使用发布来限制用户在他们的报告中看到的数据

Meteor.publish("companyReport", function(){
if(!this.userId) return null;
var user = Meteor.users.findOne(this.userId);
var userCompany = user.profile.company;
var userRole = user.roles;
var userName = user.username;

if(function(){Roles.userIsInRole(Meteor.user(), ['chiefs']);})
{return ReportCollection.find({companyName:userCompany});}

else if (function(){Roles.userIsInRole(Meteor.user(), ['managers']);})
{return ReportCollection.find({companyName:userCompany, managerName:userName});}

else
{return null;}
});

现在,在客户端我可以简单地订阅。它通常工作正常,除了:

我注意到以下我不想要的奇怪行为:如果我以“首席”角色用户身份登录,并且可以查看公司范围的报告,如果我注销然后以“经理”用户身份登录,我可以仍然看到我应该不允许看到的数据。

我知道我的出版物控制机制工作正常,因为当我从另一个浏览器以管理员身份登录时,我看到了正确的结果(更有限)

我只能得出结论,客户端上的 minimongo 将旧订阅中的收集数据保留为“首席”用户。
这个对吗?如果是这样,我如何在注销时刷新这些数据?或者?人们通常会做什么来避免这种情况?

谢谢

4

1 回答 1

3

您可能确实需要在注销时刷新此数据,这将涉及保存订阅句柄然后停止它:

// when you subscribe
var reportHandle = Meteor.subscribe('companyReport');
// then when you want to log out
reportHandle.stop();
Meteor.logout();

更新

如果我理解您的问题,您要确保仅在用户实际注销时才刷新 minimongo:

Meteor.logout(function(err) {
    if (err)
        console.log(err);
    else 
        reportHandle.stop();
});

另一个更新

啊,现在我明白你在问什么了。这取决于包,因为没有可用于此的onLogout事件侦听器。您可能可以很容易地对某些东西进行猴子修补,但我对 accounts-ui-bootstrap 还不够熟悉,无法肯定地说。

于 2014-04-25T10:39:47.000 回答