8

作为一名 iOS 开发人员,我对 webdev 非常陌生。我正在研究 Meteor 并对路由有一些疑问——如果它们很简单,我很抱歉。

我正在使用 Meteor Router 包来创建路由,但我希望某些页面只能由管理员用户访问。

  Meteor.Router.add({
        '/'         : 'home',
        '/admin'    : 'admin'
    });

所以我有一个简单的路由设置,但我不确定如何限制对 /admin 路由的访问。

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

谢谢!

客户端.html

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

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

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

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

客户端.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";
   }
};
4

4 回答 4

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'});

就我个人而言,我喜欢过滤器选项,因为它是可重复使用的,而且发生的事情更明显。

于 2013-06-11T03:29:05.580 回答
2

另一种解决方案是使用Roles包并确保用户在提供数据之前具有“管理员”角色。

$ mrt add roles

然后你可以用一个很好的语法检查角色:

if(!Roles.userIsInRole(Meteor.user(), ['admin'])) {
    // Redirect...
}

Roles 与 Meteor 帐户系统集成,并且可以很好地与大多数帐户包配合使用。

如果您正在寻找管理帐户(创建/删除角色以及从给定用户添加/删除角色),我已经创建了包Accounts Admin UI。自述文件有一个快速入门和一些关于如何将其与其他路由包集成的注释。

$ mrt add accounts-admin-ui-bootstrap-3
于 2014-02-13T20:40:16.813 回答
1

使用and参数:

Meteor.Router.add({
  '/admin': { to: 'admin', and: function() {
    if (!Meteor.user() || Meteor.user().name != 'admin'){
      Meteor.Router.to('/');
    }
  }}
});
于 2013-06-11T03:28:36.237 回答
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;
        }
    }
})

最重要的是,您所需要做的就是定义将“展示”设置为真实值的场合。

于 2017-09-29T17:55:03.043 回答