在 JavaScript / TypeScript 中使用 `instanceof` 授权用户模型安全吗?

Is it safe to authorize user models using `instanceof` in JavaScript / TypeScript?

假设我有 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() returns 当前发送请求的用户,无论是用户还是管理员

但是,我不确定这是否是区分 b/w 管理员和用户的最安全方法。

现在我的问题是,我做的对吗?哪种方法比我现在做的更好?

注意(如果有帮助): 我正在使用 Adonis.js v5、TypeScript 和 Lucid 模型

The instanceof operator tests to see if the prototype property of a constructor appears anywhere in the prototype chain of an object. The return value is a boolean value.

因此,如果 userAdmin 或其子 class 实例,user instanceof Admin 将测试为阳性。使用此模式在 JS/TS 世界中非常普遍并且只要 auth.authenticate() 正确验证用户并且 Admin 是相同的 class authenticate 方法是安全的 returns.

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

是的,你可以做到。如果您使用这种方法,您需要注意继承模式。您可能需要考虑向用户对象添加角色 属性 并将其用于检查。

使用角色道具的示例。

if (user.role === 'ADMIN') {
  ...
}

instanceof 适得其反的例子

class User {}
class Admin extends User {}

const user = new User;
const admin = new Admin;

console.log(user instanceof User); // true
console.log(user instanceof Admin); // false
console.log(admin instanceof User); // true **watch out for this**
console.log(admin instanceof Admin); // true