我的基本设置是我有一个登录页面,代表页面和经理页面。
我已经在铁路由器中设置了我的路由并在挂钩之前加入一些来验证是否有用户具有适当的角色。对于登录页面,我想看看是否有用户,什么类型的用户(使用角色),然后如果他们已经登录则发送到他们正确的页面。对于用户类型页面我想检查是否有用户,确保他们在正确的位置,如果没有,请将他们发回登录页面或正确的页面。
每个用户在profile.organization中都有一个角色('rep',organizationId)和一个组织。我检查他们在组织中扮演的角色。
除非有人恢复会话,否则这一切都很有效。如果他们从注销开始,它就会游泳,但如果他们昨天登录并重新打开网站,那么它就位于登录页面。我认为这是因为他们正在重新登录。
所以,问题是,处理检查用户是否已登录或登录的最佳方法是什么。棘手的部分是我需要从用户配置文件中获取数据以确定将它们发送到何处,所以如果他们登录,我不认为我能做到这一点。我怀疑它与this.redirect('login')vs this.render('login')
有关这是我的登录路线代码
loginsignupController = BaseController.extend ({
layoutTemplate: 'loginLayout',
loadingTemplate: 'loading',
yieldTemplates: {
'header': {to:'header'}
},
before: function() {
//check if logged in
if(!!Meteor.user()){
var org = Meteor.user().profile.organization;
console.log('logged in');
//check for rep, manager
if (Roles.userIsInRole(Meteor.userId(), 'rep', org) || Roles.userIsInRole(Meteor.userId(), 'rep', 'default')){
this.redirect('today')
} else if (Roles.userIsInRole(Meteor.userId(), ['manager'], org)) {
//if manager, send to manager home
this.redirect('managerHome')
}
}
}
});
这里是rep路由(用户类型a)
RepController = BaseController.extend({
layoutTemplate: 'repLayout',
loadingTemplate: 'loading',
yieldTemplates: {
'sidebar': {to: 'sidebar'},
'header': {to:'header'}
},
waitOn: function() {
},
data: function () {
},
before: function(){
//check if logged in
if(!Meteor.loggingIn() && !Meteor.user()) {
this.redirect("/login");
} else {
var org = Meteor.user().profile.organization;
console.log('logged in');
//check for rep, manager
if (Roles.userIsInRole(Meteor.userId(), ['manager'], org)) {
//if manager, send to manager home
this.redirect('/managerHome')
}
};
}})
谢谢!
答案 0 :(得分:1)
发生此行为是因为您尚未处理用户数据尚未从服务器到达的情况。
当用户首先注销时,它会起作用,因为要登录所有订阅都必须完成。
所以当你直接加载浏览器页面时,你试图读取用户,但是用户还没有到达并且它会被卡住。 before
不是被动的,所以当用户登录时,什么都不会改变。
要解决此问题,您需要发布用户的数据,并使用之前的waitOn
或this.subscribe(..).wait()
订阅该数据。
要记住的另一件事是Meteor.user()
在初始加载期间更改3次:
null
直到某些数据从服务器到达Meteor.user().profile.organization
为Meteor.user().profile
时,您会直接致电null
,这会导致错误