0

假设我有 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 模型

4

2 回答 2

2

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

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

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

于 2020-11-30T19:12:09.273 回答
2

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

使用角色道具的示例。

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
于 2020-11-30T19:17:30.600 回答