#node.js #express
#node.js #экспресс
Вопрос:
Я использую express-ip-access-control
для проверки ACL.
Моя функция промежуточного программного обеспечения выглядит следующим образом:
const ipAccessControl = require('express-ip-access-control')
function accessControl (req, res, next) {
ipAccessControl(someOptions)(req, res, next)
// additional ACL checking logic
...
switch(result) {
case ALLOW:
next()
break
case DENY:
res.status(400).send("denied")
}
}
Этот ipAccessControl работает хорошо, но я не знаю, как вернуться, когда ipAccessControl разрешает доступ и вызывает next() .
Приведенный выше код всегда выполняет как ipAccessControl, так и дополнительную логику проверки ACL.
Есть ли способ проверить результат ipAccessControl и возвращать только при вызове next()
ipAccessControl ?
Я не хочу, чтобы моя дополнительная логика проверки вызывалась, когда доступ разрешен ipAccessControl.
Этот ipAccessControl должен вызываться перед дополнительной логикой проверки ACL.
Любая мысль приветствуется.
Ответ №1:
Вы можете передать свою собственную функцию вместо next()
, и тогда вы узнаете, когда это будет сделано:
const ipAccessControl = require('express-ip-access-control')
function accessControl (req, res, next) {
ipAccessControl(someOptions)(req, res, function(err) {
if (err) {
// call the actual next with the error
return next(err);
} else {
// additional ACL checking logic
...
switch(result) {
case ALLOW: ...
case DENY: ...
}
// when done successfully, call next() here
// or if there's an error, then send an error response
// or call next(err)
}
})
}
Комментарии:
1. Спасибо за ваш ответ. Не могли бы вы, пожалуйста, объяснить подробнее? Я не хочу, чтобы моя дополнительная логика проверки вызывалась, когда доступ разрешен
ipAccessControl
. КогдаipAccessControl
доступ не проверяется, я перепроверяю его с помощью своего дополнительного кода.2. @yoon — Вам нужно лучше объяснить, что
ipAccessControl()
и когда именно вы делаете, и не хотите выполнять больше кода, поскольку, возможно, моя первая интерпретация того, что вы пытались выполнить, не завершена. Пожалуйста, объясните подробнее. Когда я смотрю на документацию этого модуля, похоже, что он отправляет ответ об ошибке, когда он не разрешает, и вызываетnext()
, когда разрешает. Итак, для какого именно случая вы хотите выполнить больше кода?3. Моя программа проверяет ACL IP и авторизацию hmac. Запрос отклоняется только тогда, когда ни один из них не удовлетворяет. Я использую ipAccessControl для IP ACL. Если запрос удовлетворяет этому условию ACL, он разрешает последующие операции. Если запрос поступает с неизвестного IP-адреса, вместо отклонения запроса он снова проверяет, авторизован ли запрос hmac. Если это разрешено hmac, программа принимает запрос.
4. @yoon — Насколько я могу судить
ipAccessControl()
, модуль написан не для использования таким образом. Это промежуточное программное обеспечение, которое вызываетnext()
, когда оно завершается успешно, или отправляет ответ об ошибке, когда этого не происходит. Кроме какого-то гигантского взлома, который пытается исправить запрос, чтобы перехватить и предотвратить отправку ответа, я не вижу никакого способа узнать, что проверка не прошла, и позволить вам продолжить работу с другим кодом.5. @yoon — Если бы это был мой код, я бы, вероятно, разветвил
ipAccessControl()
модуль и изменил его, чтобы его можно было использовать как обычную функцию, которая возвращает результат, позволяющий мне использовать с ним обычную логику, поэтому он никогда не отправляет ответ. Или замените его чем-то другим, что позволяет моей логике работать так, как я хочу.