作为iOS开发人员,我对webdev很新。我正在研究Meteor并对路由有一些疑问 - 如果它们非常容易,我会道歉。
我正在使用Meteor Router程序包创建路由,但我想只有admin用户可以访问一些页面。
Meteor.Router.add({
'/' : 'home',
'/admin' : 'admin'
});
所以我有一个如上所述的简单路由设置,但我不确定如何限制对/ admin路由的访问。
它就像这样简单吗?什么是限制路径到/ admin页面并显示警告或甚至将它们重定向回/页面的好方法?
谢谢!
client.html
<head>
<title>My App</title>
</head>
<body>
{{renderPage}}
</body>
<template name="home">
{{greeting}}
</template>
<template name="admin">
{{greeting}}
</template>
client.js
Template.admin.greeting = function () {
var currentUser = Meteor.user();
if (null !== currentUser && 'admin' === currentUser.username) {
return "Hello Admin!";
}
else{
return "Sorry, only admins can see this page";
}
};
答案 0 :(得分:8)
限制路由访问的最佳方法是使用路由器本身(而不是将问题推送到控制器)。您有以下几种选择:
您可以使/admin
路线看起来像:
'/admin': function() {
return {
as: 'admin',
to: function() {
if (Meteor.user() && Meteor.user().username === 'admin') {
return 'admin';
} else {
return 'unauthorized';
}
}
};
}
我假设你有一个unauthorized
模板,可以呈现403
页面或其他信息。
或者,您可以保留原始的/admin
路线并添加过滤器:
Meteor.Router.filters({
'needsAdmin': function(page) {
if (Meteor.user() && Meteor.user().username === 'admin') {
return page;
} else {
return 'unauthorized';
}
}
});
并像这样使用它:
Meteor.Router.filter('needsAdmin', {only: 'admin'});
就个人而言,我喜欢过滤器选项,因为它可以重复使用,并且更明显的是发生了什么。
答案 1 :(得分:2)
另一种解决方案是使用Roles包并确保用户在提供数据之前具有“admin”角色。
$ mrt add roles
然后你可以检查角色,例如语法很好:
if(!Roles.userIsInRole(Meteor.user(), ['admin'])) {
// Redirect...
}
Roles与Meteor帐户系统集成在一起,可与大多数帐户包很好地配合使用。
如果您要管理帐户(创建/删除角色并添加/删除给定用户的角色),我已创建了包Accounts Admin UI。 README有一个快速入门和一些关于如何将其与其他路由包集成的说明。
$ mrt add accounts-admin-ui-bootstrap-3
答案 2 :(得分:1)
使用and
参数:
Meteor.Router.add({
'/admin': { to: 'admin', and: function() {
if (!Meteor.user() || Meteor.user().name != 'admin'){
Meteor.Router.to('/');
}
}}
});
答案 3 :(得分:0)
这里的每个人都对如何保护路由器级别的管理面板提出了很好的观点。另一种可能性是一起跳过路由器。我最近使用Meteor Candy完成了这项工作,这是Meteor的一个简易管理包。
这个想法是,您可以创建一个Reactive-Dict来保存管理界面的状态。如果将其放入包中,则可以确保它永远不会与应用程序代码发生冲突。使用新的动态导入功能,您可以在需要之前将其从客户端中移除。
以下是可行的方法:
<template name="adminPanel">
{{#if show}}
{{> adminPanelUI}}
{{/if}}
</template>
AdminUI = new ReactiveDict();
Meteor.defer(function () {
Blaze.render(Template.MeteorCandy, document.body);
});
Template.adminPanel.helpers({
show: function () {
if (AdminUI.get('show')) {
return true;
}
}
})
最重要的是,您需要的只是定义将“show”设置为真值y的场合。