用户权限 – 在视图中显示编辑(快速,车把)
目前,我有用户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}}