我有一个使用Express.js框架构建的Node.js应用程序。 我想检查用户是否有权执行某个请求,我这样做是要求客户端在标头中提供访问令牌。 我不想将此添加到客户端可以访问的每个单独的功能。像这样,关于用户的信息请求:
exports.info = function(req, res) {
var userId = req.params.id,
accessToken = req.headers["accesstoken"];
console.log("received request to get info for userID <"+ userId +">");
users.User.findOne({accessToken: accessToken}, function(err, user) {
if(user == null) {
...
如何在更高级别执行此操作?我可以在全局for express上的某处设置此标头要求吗? 我想基本上为除用户登录功能之外的所有功能执行此操作,因此所有功能除了一个。
答案 0 :(得分:1)
您可以制作一个小型中间件:
verifyUser = function(req,res,next){
var userId = req.params.id, accessToken = req.headers["accesstoken"];
console.log("received request to get info for userID <"+ userId +">");
users.User.findOne({accessToken: accessToken}, function(err, user) {
if(user == null) {
...
}
next()
}
}
然后:
根据一项要求:
app.get("/user/info", verifyUser, exports.info)
在一系列请求中:
app.all(SomeRegex, verifyUser)
在所有请求中:
app.use(verifyUser)
答案 1 :(得分:0)
只需将您的功能添加为在所有请求处理之前运行的一个快速中间件。
app.use(function(req, res, next) {
var userId = req.params.id,
accessToken = req.headers["accesstoken"];
console.log("received request to get info for userID <"+ userId +">");
users.User.findOne({accessToken: accessToken}, function(err, user) {
if(user != null) {
return next(); // This is ok, keep processing
} else {
// don't call next, redirect to login page, etc...
}
}
app.get('/home', ...);
apg.get('/some_other_page');
您可以像往常一样打电话给快递处理,或者您使用重定向,或者返回错误而不要拨打下一个。
答案 2 :(得分:0)
您可以创建中间件并在每条路线上进行设置,您需要进行授权。例如:
var myAuthMiddleware = function (req, res, next) {
// Here goes your code to check if the user complies
// with the conditions. You can use req.headers, req.user, etc
if (conditionIsMet) return next(); // If the user complies, you continue the process
// The user doesn't comply
return res.send('Error');
}
然后,您在所需的路线中使用他的中间件:
app.get('/my-route', myAuthMiddleware, myRouteHandler);
app.post('/another-route', myAuthMiddleware, myOtherRouteHandler);
// This one doesn't need auth
app.get('/', indexHandler);