如何限制Meteor中管理员用户的路由?

kur*_*kun 8 meteor

作为iOS开发人员,我对webdev很新.我正在研究Meteor并对路由有一些疑问 - 如果它们非常容易,我会道歉.

我正在使用Meteor Router程序包创建路由,但我想只有一些页面只能由admin用户访问.

  Meteor.Router.add({
        '/'         : 'home',
        '/admin'    : 'admin'
    });
Run Code Online (Sandbox Code Playgroud)

所以我有一个简单的路由设置如上,但我不知道如何限制访问/ admin路由.

它就像这样简单吗?什么是限制路径到/ admin页面并显示警告或甚至将它们重定向回/页面的好方法?

谢谢!

client.html

<head>
   <title>My App</title>
</head>

<body>
   {{renderPage}}
</body>

<template name="home">
    {{greeting}}
</template>

<template name="admin">
    {{greeting}}
</template>
Run Code Online (Sandbox Code Playgroud)

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";
   }
};
Run Code Online (Sandbox Code Playgroud)

Dav*_*don 8

限制路由访问的最佳方法是使用路由器本身(而不是将问题推送到控制器).您有以下几种选择:

路由功能

您可以使/admin路线看起来像:

'/admin': function() {
  return {
    as: 'admin',
    to: function() {
      if (Meteor.user() && Meteor.user().username === 'admin') {
        return 'admin';
      } else {
        return 'unauthorized';
      }
    }
  };
}
Run Code Online (Sandbox Code Playgroud)

我假设你有一个unauthorized模板,可以呈现403页面或信息.

过滤

或者,您可以保留原始/admin路线并添加过滤器:

Meteor.Router.filters({
  'needsAdmin': function(page) {
    if (Meteor.user() && Meteor.user().username === 'admin') {
      return page;
    } else {
      return 'unauthorized';
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

Meteor.Router.filter('needsAdmin', {only: 'admin'});
Run Code Online (Sandbox Code Playgroud)

就个人而言,我喜欢过滤器选项,因为它可以重复使用,而且更明显的是发生了什么.

  • @thinklinux不是真的.从技术上讲,没有办法阻止用户在客户端上做任何事情(因为他可以改变在他的浏览器中运行的代码).您可以做的最好是添加上面的客户端检查**和**仅发布用户应该看到的数据(在服务器上控制)**和**保护您的数据库突变(允许/拒绝/等等.).在最坏的情况下,用户可以*访问*管理页面但无法查看或执行任何操作. (2认同)
  • @thinklinux这取决于您如何设置出版物.例如,假设您的管理路由(假设为铁路由器),您可以使用以下命令获取管理数据:`Meteor.subscribe('documentsForAdmin')`.然后,服务器端发布功能可以在发送文档之前验证用户是否为管理员.此外,您的路由器可以在显示页面之前验证用户确实是管理员.我们可以相信服务器只发布授权数据,但是我们不能信任路由器,因为客户端可能已经修补了他的代码以允许这样做. (2认同)