当我写政策时,它不起作用。我的代码有什么问题?

policy.js

'UserController': {
    'create': ['canCreate']
}


routes.js

'post /register': {
    controller: 'UserController',
    action: 'create'
}


政策/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
            })
        })
    }
};

最佳答案

该策略正在寻找req.session.canCreate,但是只能在UserController.create中设置的代码中找到该代码,而该代码无法在控制器方法之前运行,因此无法访问。如果您确实想要这种策略,则需要添加另一个端点,该端点将初始化并设置req.session.canCreate = true;

根据总体结构,我可能会将策略更改为:

if (!req.session.authenticated) {
    return next();
}
else {
    res.forbidden('already authenticated')
}


我将在用户创建和登录时设置req.session.authenticated。换句话说,任何人*都可以创建一个用户帐户,前提是他们当前尚未登录。如果他们已经登录,则该策略将拒绝用户创建。 (当然,这并不是适用于所有用例的解决方案,因此,它更多是一个起点。请根据您自己的需求进行调整。)

*仍然可以通过验证码或共享/私有机密或其他某种方式来限制用户创建,这可以在控制器或策略中进行检查。

关于javascript - 帆政策不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37495435/

10-09 22:16