仅按 token 中的 userId 显示数据
Show data only by userId in token
我用谷歌搜索 :) 但我找不到如何正确保护端点的解决方案,问题是当我签署用户时我有令牌并且我的 userId 是 1 然后我可以进行 GET 和 POST请求,但如果我使用路由示例: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'],
},
};
我用谷歌搜索 :) 但我找不到如何正确保护端点的解决方案,问题是当我签署用户时我有令牌并且我的 userId 是 1 然后我可以进行 GET 和 POST请求,但如果我使用路由示例: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'],
},
};