在 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.
因此,如果 user
是 Admin
或其子 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
假设我有 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.
因此,如果 user
是 Admin
或其子 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