这是关于node.js和restful api的问题。
我使用mongoose.Schema创建了一个ProductModel,这是读取产品列表的路径。
app.get('/api/products', function (req, res) {
ProductModel.find(function (err, products) {
if (!err)
res.json(products);
else
console.log(err);
});
});
当我在本地服务器上运行此应用程序并访问url *:3000 / api / products时,我可以看到json数据列表。如果我在真实服务器上运行测试,这意味着访问该URL的任何人都可以看到数据。
如何实际隐藏其他用户的数据?
答案 0 :(得分:1)
如果您的标准只是特定用户可以访问它,或者只有签名用户可以访问它,那么您可以使用如下的帮助函数来执行此操作。
app.get('/api/products', check_user, function(req, res) {
ProductModel.find(function(err, products) {
if (!err)
res.json(products);
else
console.log(err);
});
});
function check_user(req, res, next) {
//if you are using sessions then you can get the current user with req.user
if (req.user != 'xyz') return res.json('message': 'you dont have permissions to access this url');
next(); //if it is xyz then call the next() iterator function that will take u to the final callback(productFind)
};
答案 1 :(得分:1)
以前的答案肯定适用于单个网址或简单用户。如果您正在使用包含大量用户和不同授权级别的完整应用程序,则需要一个安全框架。
我是cansecurity的作者https://github.com/deitch/cansecurity
使用cansecurity,您可以通过编程方式执行此操作:
cs = require('cansecurity');
app.use(cansec.validate);
app.get('/api/products', cansec.restrictToLoggedIn, function(req, res) {...});
// or lots of other built in authorization restrictions
app.get('/api/products', cansec.restrictToRoles("admin"), function(req, res) {...});
app.get('/api/products', cansec.restrictToSelf, function(req, res) {...});
或者您甚至可以在json配置文件中声明所有授权路径:
app.use(cansec.validate);
app.use(cansec.authorizer('./route-security.json'));
然后你的配置:
{
"routes": [
// [verb,path,default,[test params,] test condition]
["GET","/api/products",true,"user === 'xyz'"],
// and lots of other options
["GET","/api/user/:user","user.roles.admin === true || user.id === req.param('user')"],
["GET","/api/user/:user",{"private":"true"},"user.roles.admin === true || user.id === req.param('user')"],
["PUT","/api/user/:user","user.roles.admin === true || user.id === req.param('user')"],
["GET","/api/user/:user/roles","user.roles.admin === true || user.id === req.param('user')"],
["PUT","/api/user/:user/roles","user.roles.admin === true"]
]
}