我用谷歌搜索:)但是我找不到解决方案来正确地保护端点,问题是当我给用户签名时,我已经获得令牌并且我的userId为1,然后我可以进行GET和POST请求,但是如果我使用route例如:blablabla.com/users/1我可以看到所有数据,而blablabla.com/users/2也可以看到所有数据。如何仅对已签名的ID限制和显示数据,而对于其余ID,则禁止请求]
感谢您的回复
您可以使用政策来实现这一目标。首先,您必须创建一个自定义策略。
创建文件api/policies/isAuthorised.js
module.exports = function (req, res, next) {
let token;
if (req.headers && req.headers.authorization) {
const parts = req.headers.authorization.split(' ');
if (parts.length === 2) {
const scheme = parts[0];
const credentials = parts[1];
if (/^Bearer$/i.test(scheme)) {
token = credentials;
}
} else {
return res.status(401).json({
message: 'Format is Authorization: Bearer [token]'
});
}
} else if (req.param('token')) {
token = req.param('token');
delete req.query.token;
} else {
return res.status(401).json({
message: 'No authorization header was found'
});
}
// replace it with you own token verfication mechanism
sails.helpers.jwt.verify(token, (err, decoded) => {
if (err) {
return res.status(401).json({
message: 'Invalid Token!'
});
}
req.token = token;
User.findOne({
id: decoded.userid
}).then((user) => {
req.currentUser = user;
next();
});
});
};
此策略将确保用户使用有效令牌进行访问。您需要另一个策略来限制仅拥有自己的文档。在文件api/policies/isOwner.js
中创建另一个
module.exports = function (req, res, next) { try { switch (req.options.model) { case 'user': { User.findOne({ id: req.param('id') }).then( (user) => { if (!user) { return res.status(401).json({ message: 'Invalid request' }); } if ( user.id === req.currentUser.id) { next(); } else { return res.status(401).json({ message: 'Invalid request' }); } } ); break; } default: { return res.status(401).json({ message: 'Invalid request' }); } } } catch (error) { return res.status(401).json({ message: 'Bad Request' }); } };
现在将这两个策略都应用于您的控制器
config/policies.js
module.exports.policies = {
'*': false,
UserController: {
'*': false, //this will prevent accessing any other api such as delelt update etc.
'findOne': ['isAuthorised', 'isOwner'],
},
};