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

目前,我有用户configuration文件使用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呈现的模板上我想显​​示一个编辑button, 如果用户可以编辑正在查看的configuration文件。

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

附加信息:

  • 我们每个用户都使用护照本地策略进行身份validation
  • 目前路线上有一些基本的中间件

中间件

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

我已经研究过中间件,比如connect-roles ,我不认为它需要什么?

我在想,我应该在res.render()方法的局部variables中传递一个布尔值,然后允许我使用res.render()来显示button。

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

有任何想法吗?

有一种方法可以做到这一点,就像你所build议的那样,使用profileOwner权限来保存你的模板模型。 假设您只想允许用户编辑自己的configuration文件。 使用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}} 

我认为最好的方法是创build一个帮助程序,检查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}}