1

我正在尝试让我的第一个网络应用程序起步,所以我很清楚这是一个初学者的问题。

我正在使用 Node、express 和 Mongo 作为后端,Stormpath 提供用户登录/身份验证和用于视图的翡翠。登录功能运行良好,只是我想为非管理员用户隐藏“上传新计划”按钮:

// app.js

...
app.use(stormPathmiddleware);

app.get('/', function(req, res) {
   res.render('home', {
     title: 'Welcome'
   });
);

app.get('/upload', stormpath.groupsRequired(['Enforced']), function(req, res) {
   res.render('upload', {
      title: 'Upload Excel File'
   });
});
....

我有两组人想要使用它:经理和其他所有人。所以home.jade:

html
  head
    title=title
    link(href='//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css', rel='stylesheet')
  body
    div.container
      div.jumbotron
        h1 Hello!

        if user
          p Welcome, #{user.fullName}
          p
          a.btn.btn-primary(href="/upload") Upload New Schedule
          br
          br
          a.btn.btn-primary(href="/logout") Logout
        else
          p Login now to see this weeks schedule. 
          p
            a.btn.btn-primary(href="/login") Login now

如何让jade将上传按钮隐藏给未作为第一组(经理)登录的人?中间件工作得很好,如果不是经理的人尝试单击该按钮,他们会得到一个错误页面,但我宁愿隐藏它。

4

1 回答 1

0

你需要在这里做的是:

  • 在您的路线代码中预加载您想要执行的权限检查。
  • 将此传递到您的模板中。
  • 在您的模板中使用此变量来显示或不显示内容。

以下是它如何适用于您的用例:

app.get('/upload', function(req, res, next) {
  var isManager = false;

  // Search through this user's groups, for any group named 'managers'.
  req.user.getGroups({ name: 'managers' }, function(err, groups) {
    if (err) return next(err);

    // If this user is a member of a 'managers' group, it means
    // this user is a manager.
    if (groups.items && groups.items[0].name === 'managers') {
      isManager = true;
    }

    res.render('upload', {
      title: 'Upload Excel File',
      isManager: isManager  // Pass in the membership information to Jade.
    });
  });
});

现在我们已经定义了一个路由并传入了管理器信息,我们可以编写一个 Jade 文件来执行以下操作:

if isManager
  // display html code here for managers
else
  // display NON manager html code here

希望这有帮助!我是这个图书馆的作者,只是偶然发现了这个=)

我目前正在寻找新的方法来让这在未来变得更容易,所以希望在下一个大版本中它会更简单一些 =)

于 2015-07-20T16:00:57.223 回答