nestjs - Nestjs中的createParamDecorator VS CanActivate进行授权
问题描述
我正在尝试根据用户的权限授权用户。使用 createParamDecorator 和 CanActivate 方法在功能上有什么区别吗?
export const GetUser = createParamDecorator((data: string, ctx: ExecutionContext) : User => {
const request = ctx.switchToHttp().getRequest();
const user = request.user;
const permissions = user.permissions
for(var i = 0; i < permissions.length; i++){
if(permissions[i].name === data)
return user;
}
throw new NotFoundException()})
解决方案
这些绝对不是等效的方法,不应被视为等效方法。这createParamDecorator
应该是告诉 Nest 如何注入自定义值的简单方法(例如req.user
,而不是必须做@Req() { user }
)。它从来都不是用来授权的,虽然你可以,但它很可能会导致非常奇怪的堆栈跟踪。
另一方面,警卫是为请求的身份验证和授权而设计的。您可以在处理程序上设置元数据(例如允许哪些角色),使用 读取它们Reflector
,然后应用请求是否有效的条件逻辑。您还可以在守卫上使用依赖注入来添加诸如数据库连接之类的内容,并通过 ID 从数据库中获取完整用户,这在createParamDecorator
.
最后,在守卫中,你可以抛出任何你想要的错误,或者你可以false
通过 Nest 的设计返回并取回 403。
功能上有什么不同吗...?
如前所述,依赖注入。在我看来,测试守卫也更容易。但这就是我。
推荐阅读
- php - 覆盖postgresql表php中的数据
- windows - 在 Windows 上安装 secp256k1 库时出错
- mysql - 一个复合索引或多个外键索引?
- drools - Drools:为什么 indexOf() 在 LHS 中不起作用?
- mysql - Yii2 MySQL如何防止重复选择查询
- sql - 如何提高运行 SQL Server 数据库的 django 站点的数据库查询性能?
- java - Jackson 总是序列化完整对象或总是序列化 id
- java - sybase java DB连接问题
- php - 防止 HTML 输出到 STDOUT - Google App Engine 开发环境
- python - ODEINT 错误:ValueError:使用序列设置数组元素