Nestjs中的createParamDecorator VS CanActivate进行授权
createParamDecorator VS CanActivate in Nestjs for authorization
我正在尝试根据用户的权限对其进行授权。使用 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 }
)。它从来没有打算用于授权,虽然你可以,但它很可能会导致非常奇怪的堆栈跟踪。
另一方面,Guards 用于请求的身份验证和授权。您可以在处理程序上设置元数据(例如允许哪些角色),使用 Reflector
读取它们,然后应用请求是否有效的条件逻辑。您还可以在守卫上使用依赖注入来添加诸如数据库连接之类的东西,并通过 ID 从数据库中获取完整用户,这在 createParamDecorator
.
中是不可能的
最后,在守卫中你可以抛出任何你想要的错误,或者你可以 return false
并返回 Nest 设计的 403。
Is there any difference in functionality...?
如前所述,依赖注入。在我看来,测试守卫也更容易。但这就是我。
我正在尝试根据用户的权限对其进行授权。使用 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 }
)。它从来没有打算用于授权,虽然你可以,但它很可能会导致非常奇怪的堆栈跟踪。
另一方面,Guards 用于请求的身份验证和授权。您可以在处理程序上设置元数据(例如允许哪些角色),使用 Reflector
读取它们,然后应用请求是否有效的条件逻辑。您还可以在守卫上使用依赖注入来添加诸如数据库连接之类的东西,并通过 ID 从数据库中获取完整用户,这在 createParamDecorator
.
最后,在守卫中你可以抛出任何你想要的错误,或者你可以 return false
并返回 Nest 设计的 403。
Is there any difference in functionality...?
如前所述,依赖注入。在我看来,测试守卫也更容易。但这就是我。