当我写政策时,它不起作用。我的代码出了什么问题?
policies.js
'UserController': {
'create': ['canCreate']
}
routes.js
'post /register': {
controller: 'UserController',
action: 'create'
}
policies / canCreate.js
module.exports = function (req, res, next) {
if (req.session.canCreate) {
return next();
}
else {
res.send('no auth')
}
};
UserController.js
module.exports = {
create: function (req, res) {
req.session.canCreate = true;
User.create({
name: req.param('name'),
password: req.param('password')
}, function onSuccess(err, newUser) {
if (err) {
return res.negotiate(err);
}
res.json({
id: newUser.id
})
})
}
};
答案 0 :(得分:1)
该策略正在查找req.session.canCreate
,但是您的代码只能在UserController.create
内设置,因为该策略是在控制器方法之前运行的,因此无法访问该代码。如果您真的想要这种策略,则需要添加另一个端点,该端点将初始化并设置req.session.canCreate = true;
根据整体结构,我可能会将政策更改为:
if (!req.session.authenticated) {
return next();
}
else {
res.forbidden('already authenticated')
}
我会在用户创建和登录时设置req.session.authenticated
。换句话说,任何*都可以创建用户帐户,前提是他们当前没有登录;如果他们已经登录,那么策略将拒绝用户创建。 (当然,这不是所有用例的正确解决方案,因此它更多地是一个起点。根据您自己的需要进行调整。)
*仍然可以通过验证码或共享/私人秘密或其他方式限制用户创建,这些秘密可以在控制器或政策中进行检查。