微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Nestjs 中使用 createParamDecorator VS CanActivate 进行授权

如何解决在 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。

功能上有什么不同吗...?

如前所述,依赖注入。在我看来,测试守卫也更容易。但那是我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?