登录不同角色后管理路线的正确方法
Correct way to manage routes after sign in for different roles
我有 2 个角色,管理员和用户。我有一条主页路线 '/'
,它只是一个登录页面。当管理员用户登录时,他们必须转到一条路线 ('adminPortal'
),而当用户用户登录时,他们必须转到 'userPortal'
路线。注销后,两个角色都应路由回 '/'
.
在我担任管理员角色之前,我是这样登录的:
Router.onBeforeAction(function() {
this.render('loading');
if (! Meteor.userId()) {
this.render('Home');
} else {
this.next();
}
});
效果很好(实际上它破坏了我刚刚发现的 waitOn:
渲染加载模板内容,但稍后会详细介绍)。然后我添加了这样的角色(来自我现在找不到的 Stack Overflow 答案):
服务器/
insertUsers=function(){
var adminId=Accounts.createUser({
username:"admin",
password:"password"
});
Roles.addUsersToRoles(adminId,"admin");
var userIdd = Accounts.createUser({
username:"user",
password:"password"
});
Roles.addUsersToRoles(userIdd,"user");
};
和
Meteor.startup(function () {
// always start from scratch (you will want to comment this line at some point !)
Meteor.users.remove({});
if(Meteor.users.find().count()===0){
insertUsers();
}
})
和
Meteor.publish("user", function () {
if (this.userId) {
return Meteor.users.find({_id: this.userId},
{fields: {'roles': 1}});
} else {
this.ready();
}
});
我尝试像这样路由到 user/admin 门户:
router.js
Router.route('/', {
before: function() {
if (! Meteor.userId()) { // I acutally added this check that the user is not logged in after the infinite loading problem but I thought the question was getting too long so I just left it in rather
this.render('Home')
} else {
if (Roles.userIsInRole(Meteor.user(), 'admin')) {
Router.go('/admin')
} else {
Router.go('/user')
}
}
},
waitOn: function () {
return Meteor.subscribe('user');
}
});
现在这几乎可以工作了!如果我以任一用户身份登录,我会转到正确的门户。但是,当我注销时,我的 onBeforeAction
(即这个问题中的第一个代码块)只呈现 Home
模板,实际上并没有将 URL 更改为 '/'
(即URL 仍然是 '/user'
或 '/admin'
)。现在,当我第二次尝试登录时,它将始终带我到第一次登录时的路线,除非我手动将浏览器 URL 更改为 '/'
。所以我想我只是用 Router.go('/');
替换 this.render('Home')
但这似乎已经创建了某种无限循环,其中 Home
模板永远不会呈现(它现在偶然做了第一个虽然时间正确地呈现了我的加载模板)。
感谢您阅读所有内容!正确的做法是什么?
尝试在注销按钮事件中添加 Router.go('/');
以及 Meteor.logout();
示例:
Template.loginButtons.events({
'click #login-buttons-logout' : function (event, template) {
Meteor.logout(function(err) {
Router.go('/');
});
}
});
我遇到了和你一样的问题,这是我发现注销后 return 回到主页的最简单方法。
我有 2 个角色,管理员和用户。我有一条主页路线 '/'
,它只是一个登录页面。当管理员用户登录时,他们必须转到一条路线 ('adminPortal'
),而当用户用户登录时,他们必须转到 'userPortal'
路线。注销后,两个角色都应路由回 '/'
.
在我担任管理员角色之前,我是这样登录的:
Router.onBeforeAction(function() {
this.render('loading');
if (! Meteor.userId()) {
this.render('Home');
} else {
this.next();
}
});
效果很好(实际上它破坏了我刚刚发现的 waitOn:
渲染加载模板内容,但稍后会详细介绍)。然后我添加了这样的角色(来自我现在找不到的 Stack Overflow 答案):
服务器/
insertUsers=function(){
var adminId=Accounts.createUser({
username:"admin",
password:"password"
});
Roles.addUsersToRoles(adminId,"admin");
var userIdd = Accounts.createUser({
username:"user",
password:"password"
});
Roles.addUsersToRoles(userIdd,"user");
};
和
Meteor.startup(function () {
// always start from scratch (you will want to comment this line at some point !)
Meteor.users.remove({});
if(Meteor.users.find().count()===0){
insertUsers();
}
})
和
Meteor.publish("user", function () {
if (this.userId) {
return Meteor.users.find({_id: this.userId},
{fields: {'roles': 1}});
} else {
this.ready();
}
});
我尝试像这样路由到 user/admin 门户:
router.js
Router.route('/', {
before: function() {
if (! Meteor.userId()) { // I acutally added this check that the user is not logged in after the infinite loading problem but I thought the question was getting too long so I just left it in rather
this.render('Home')
} else {
if (Roles.userIsInRole(Meteor.user(), 'admin')) {
Router.go('/admin')
} else {
Router.go('/user')
}
}
},
waitOn: function () {
return Meteor.subscribe('user');
}
});
现在这几乎可以工作了!如果我以任一用户身份登录,我会转到正确的门户。但是,当我注销时,我的 onBeforeAction
(即这个问题中的第一个代码块)只呈现 Home
模板,实际上并没有将 URL 更改为 '/'
(即URL 仍然是 '/user'
或 '/admin'
)。现在,当我第二次尝试登录时,它将始终带我到第一次登录时的路线,除非我手动将浏览器 URL 更改为 '/'
。所以我想我只是用 Router.go('/');
替换 this.render('Home')
但这似乎已经创建了某种无限循环,其中 Home
模板永远不会呈现(它现在偶然做了第一个虽然时间正确地呈现了我的加载模板)。
感谢您阅读所有内容!正确的做法是什么?
尝试在注销按钮事件中添加 Router.go('/');
以及 Meteor.logout();
示例:
Template.loginButtons.events({
'click #login-buttons-logout' : function (event, template) {
Meteor.logout(function(err) {
Router.go('/');
});
}
});
我遇到了和你一样的问题,这是我发现注销后 return 回到主页的最简单方法。