首页 > 解决方案 > 在 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 模型

标签: javascripttypescriptadonis.jslucid

解决方案


运算符测试构造函数的instanceof原型属性是否出现在对象原型链的任何位置。返回值是一个布尔值。

因此,如果is或其子类实例user instanceof Admin将测试为阳性。使用这种模式在 JS/TS 世界中很常见,只要正确验证用户并且返回相同的类方法,它是安全的。userAdminauth.authenticate()Adminauthenticate

同样在 TypeScriptinstanceof中被视为TypeGuard,因此if您可以在块内user用作Admin实例(例如,如果管理实例有更多方法)。


推荐阅读