在 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 模型


潇湘沐
浏览 58回答 2
2回答

慕田峪9158850

是的,你可以这样做。如果使用此方法,您将需要小心继承模式。您可能需要考虑向用户对象添加角色属性并将其用于检查。使用角色属性的示例。if (user.role === 'ADMIN') {  ...}instanceof 对你产生适得其反的例子class User {}class Admin extends User {}const user = new User;const admin = new Admin;console.log(user instanceof User); // trueconsole.log(user instanceof Admin); // falseconsole.log(admin instanceof User); // true **watch out for this**console.log(admin instanceof Admin); // true

慕斯王

该instanceof运算符测试构造函数的原型属性是否出现在对象原型链中的任何位置。返回值是一个布尔值。因此,如果是或其子类实例,user instanceof Admin将测试为正。使用这种模式在 JS/TS 世界中非常常见,只要正确验证用户并且返回相同的类方法,它就是安全的。userAdminauth.authenticate()Adminauthenticate同样在 TypeScript 中instanceof被视为TypeGuard,因此在if块内您可以用作user实例Admin(例如,如果管理实例有更多方法)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript