用户权限 - 在视图中显示编辑(快速、车把)

User Permission - Display edit in view (express, handlebars)

目前我有使用 Handlbars 呈现的用户配置文件:

exports.profile = function(req, res) {
  User.findOne({username: req.params.username}).exec(function(err, user){
    res.render('profile/view', {
      user: req.user,
      name: user.name,
      username: user.username
    });
  });
};

profile/view 处呈现的模板上,我想显示一个编辑按钮 如果 用户可以编辑正在查看的配置文件。

<a href="/edit/usernamehere">Edit your profile here</a>

附加信息:

中间件

app.get('/:username', isAuth, user.profile);

  function isAuth(req, res, next) {
    if (req.isAuthenticated()) {
      return next();
    }
    req.flash('alert', 'First you need to log in');
    res.redirect('/login');
  }

我研究过用于 express 的中间件,例如 connect-roles,但我认为它不是我需要的?

我在想的是,我应该在 res.render() 方法的局部变量中传递一个布尔值,然后允许我使用手柄来显示或不显示按钮。

{{#if profileOwner }}<a href="#">...

有什么想法吗?

您可以做到这一点的一种方法是按照您的建议使用 profileOwner 权限对模板模型进行水合。假设您只想允许用户编辑他们自己的配置文件。使用 connect-roles 您可以设置这样的规则:

user.use('profile owner', function (req, action) {
    return req.isAuthenticated() &&
        req.user.username === req.params.username;
})

然后您的路由逻辑可以是:

exports.profile = function(req, res) {
  User.findOne({username: req.params.username}).exec(function(err, user){
    res.render('profile/view', {
      user: req.user,
      name: user.name,
      username: user.username,
      profileOwner: req.user.is('profile owner')
    });
  });
};

那么你的小胡子 "if" 语法将如下所示:

{{#profileOwner}}<a href="#">Tada</a>{{/profileOwner}}

如果您愿意,可以像这样处理否定案例:

{{^profileOwner}}You are not a profile owner!{{/profileOwner}}

我认为最好的方法是创建一个帮助程序来检查 userCan 是否适合您。帮手在这里:

Handlebars.registerHelper('ifUserCan', function(action, options) {
    var actions = action.split(/\s*,\s*/);

    for (var i = 0; i < actions.length; i++) {
        if (this.userCan(actions[i])) {
            return options.fn(this);
        }
    }
    return options.inverse(this);
});

您可以按如下方式使用它:

{{#ifUserCan 'show all store categories'}}
    <li><a href="/categories">{{__ 'Show categories'}}</a></li>
{{/ifUserCan}}