javascript - 在 JavaScript / TypeScript 中使用“instanceof”授权用户模型是否安全?
问题描述
假设我有 3 个模型:管理员、用户、产品(我正在使用模型类)
只有管理员可以添加、更新、删除产品,用户只能获取产品,所以我为相应的路由注册了一个 ACL 中间件。
现在在我的 ACL 中间件中,我想授权用户,如果他们是ADMIN,我将调用next()
方法,否则,我将使用401
.
我发现使用 JavaScript 的运算符很容易进行检查instanceof
:
const user = await auth.authenticate()
if (user instanceof Admin) {
await next()
} else {
throw UnAuthorizedUserException
}
await auth.authenticate()
返回发送请求的当前用户,无论是用户还是管理员
但是,我不确定这是否是区分黑白管理员和用户的最安全方法。
现在我的问题是,我做得对吗?哪种方法比我正在做的更好?
注意(如果有帮助):我使用的是 Adonis.js v5、TypeScript 和 Lucid 模型
解决方案
运算符测试构造函数的
instanceof
原型属性是否出现在对象原型链的任何位置。返回值是一个布尔值。
因此,如果is或其子类实例user instanceof Admin
将测试为阳性。使用这种模式在 JS/TS 世界中很常见,只要正确验证用户并且返回相同的类方法,它是安全的。user
Admin
auth.authenticate()
Admin
authenticate
同样在 TypeScriptinstanceof
中被视为TypeGuard,因此if
您可以在块内user
用作Admin
实例(例如,如果管理实例有更多方法)。
推荐阅读
- linux - 如何在 nohup 输出中找到具有特定文件名的模式?
- amazon-web-services - 与不同 AWS 账户的用户共享 AMI
- php - 未定义变量:将 laravel 升级到 5.7 后视图中的 data_test
- python - 散景:在多个人物上使用相同的工具效果
- java - 如何将draw.io集成到java网站?
- python - 在 python os.walk 脚本的命令行中定义参数
- boolean-logic - 具有大量变量的布尔代数表达式简化
- xml - 导入谷歌表格的xpath问题
- xamarin - xamarin 表单中数据网格的无限滚动
- javascript - 以干净的方式包装承诺