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