为了账号安全,请及时绑定邮箱和手机立即绑定

在 JavaScript / TypeScript 中使用“instanceof”授权用户模型是否

在 JavaScript / TypeScript 中使用“instanceof”授权用户模型是否

潇湘沐 2023-09-21 18:23:37
假设我有 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 模型
查看完整描述

2 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

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


使用角色属性的示例。


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


查看完整回答
反对 回复 2023-09-21
?
慕斯王

TA贡献1864条经验 获得超2个赞

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

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

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


查看完整回答
反对 回复 2023-09-21
  • 2 回答
  • 0 关注
  • 53 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信