我遇到了一个我不知道如何解决的问题,我找不到任何关于它的信息。想象一下,我在一个快速应用程序中有以下路由:
// app.js
app.use('/users', require('./routes/users'));
// routes/users.js
router.use(accesoExterno);
router.route('/login').get(...).post(...).put(...)
...
在数据库accesoExterno
中,必须有一个类型列boolean
说明用户是否具有“外部”访问权限,也就是说,如果他没有连接到他启动服务器的网络。
我应该在中间件中做什么accesoExterno
来执行此检查?
function accesoExterno(req, res, next){
//PSEUDO-CODE
db.users.get('accesoExterno')
.then( tieneAcceso => {
if(!tieneAcceso){
// Si no tiene acceso comprobar que está conectado a la misma red
}
})
}
编辑
我尝试过的事情:
- req.host -> 它返回主机。我可以检查它是否从“localhost”运行,这将是一个选项。但是如果通过“127.0.0.1”或者直接从IP输入呢?
- req.ip -> 我认为这对我有用,因为如果我连接到我的网络,它会返回我的网络的 IP,如果没有,它会返回我的设备的 IP?
对我的疑问的任何澄清都会有很大帮助。
的值为
req.ip
您提供发出请求的用户 ip 的“假定”值。如果您使用自己的设备配置加入它,您可以确定它是否属于与您相同的 IP 范围。要确定您自己的配置,您可以使用带有函数os.networkInterfaces的本机os模块
从现在开始,您只需遍历这些值并检查其中是否至少有一个与您服务器上的匹配。中间件功能将是这样的。
在示例中,我使用了ip模块,它带来了一些非常方便的工具来管理 ip 和子网。
您可以在 Wikipedia 文章中阅读有关此过程的更多信息
https://en.wikipedia.org/wiki/Subnetwork
请注意,如果设置设置为 ,它可能
req.ip
不起作用,并且该值可能被用户或链中的任何代理欺骗。trust-proxy
false