当前位置: 首页 > news >正文

对网站建设的看法好的制造公司站制作

对网站建设的看法,好的制造公司站制作,公司网站手机端和电脑端,线上运营推广好处在于守卫 带上装饰器 Injectable() 并实现了 CanActivate 接口的类#xff0c;就是守卫。 守护只做一件事情。他们根据运行时的某些条件#xff08;如权限、角色、ACL等#xff09;来决定一个给定的请求是否会被路由处理程序处理。这通常被称为授权。在传统的Express应用程序中…守卫 带上装饰器 Injectable() 并实现了 CanActivate 接口的类就是守卫。 守护只做一件事情。他们根据运行时的某些条件如权限、角色、ACL等来决定一个给定的请求是否会被路由处理程序处理。这通常被称为授权。在传统的Express应用程序中授权、认证通常由中间件处理。中间件对于认证来说是一个很好的选择因为像令牌验证和为请求对象附加属性这样的事情与特定的路由上下文及其元数据没有紧密联系。 但是中间件存在天然缺陷。它不知道在调用next()函数后哪个处理程序将被执行。另一方面守卫可以访问 ExecutionContext 实例因此知道下一步将执行什么。它们的设计很像异常过滤器、管道和拦截器可以让你在请求/响应周期中的正确位置插入处理逻辑而且是以声明的方式进行。 守护在所有中间件之后执行但在任何拦截器或管道之前。 授权守卫 如前所述授权是守卫的典型的使用案例因为只有当调用者通常是一个特定的认证用户有足够的权限时特定的路由才能使用。下面代码里面的 AuthGuard 假定有一个经过认证的用户因此在请求头文件中附有一个令牌。它将提取并验证令牌并使用提取的信息来确定请求是否可以继续。 import { Injectable, CanActivate, ExecutionContext } from nestjs/common; import { Observable } from rxjs;Injectable() export class AuthGuard implements CanActivate {canActivate(context: ExecutionContext,): boolean | Promiseboolean | Observableboolean {const request context.switchToHttp().getRequest();return validateRequest(request);} }如果你正在寻找一个关于如何在你的应用程序中实现认证机制的真实案例请访问本章。同样对于更复杂的授权例子请查看本页面。 validateRequest()函数内部的逻辑可以根据需要简单或复杂。这个例子的重点是展示守卫是如何融入请求/响应周期的。 每个守卫都必须实现一个canActivate()函数。这个函数应该返回一个布尔值表明当前的请求是否被允许。它可以同步或异步地返回响应通过Promise或Observable。Nest使用返回值来控制下一个动作 如果它返回true该请求将被处理。 如果它返回falseNest将拒绝该请求。执行上下文 canActivate()函数需要一个参数即ExecutionContext(执行上下文)实例。ExecutionContext 继承自 ArgumentsHost。我们之前在异常过滤器一章中看到了ArgumentsHost。在上面的例子中我们只是使用了定义在ArgumentsHost上的相同的辅助方法我们先前使用了这些方法以获得对Request对象的引用。你可以参考异常过滤器一章中的Arguments host部分了解更多关于这个主题的内容。 通过扩展ArgumentsHostExecutionContext还增加了几个新的辅助方法提供关于当前执行过程的额外细节。这些细节有助于构建更多的通用守护这些守护可以在广泛的控制器、方法和执行上下文中工作。在这里了解更多关于ExecutionContex的信息。 基于角色的认证 让我们建立一个功能更强的守卫只允许具有特定角色的用户访问。我们将从一个基本的守卫开始并在接下来的章节中对其进行构建。现在它允许所有请求继续进行 import { Injectable, CanActivate, ExecutionContext } from nestjs/common; import { Observable } from rxjs;Injectable() export class RolesGuard implements CanActivate {canActivate(context: ExecutionContext,): boolean | Promiseboolean | Observableboolean {return true;} }绑定守卫 像管道和异常过滤器一样守护可以作用在控制器上方法上或者全局的。下面我们使用UseGuards()装饰器设置了一个控制器上的守卫。这个装饰器可以接受一个单独的参数或者一个逗号分隔的参数列表。这让你可以通过一个声明轻松地应用适当的守卫集。 Controller(cats) UseGuards(RolesGuard) export class CatsController {}UseGuards() 装饰器是从 nestjs/common 包中导入的。 上面我们传递了RolesGuard类而不是一个实例将实例化的责任留给了框架并实现了依赖性注入。与管道和异常过滤器一样我们也可以传递一个新的实例 Controller(cats) UseGuards(new RolesGuard()) export class CatsController {}上面的代码处理的时候会将守卫附加到这个控制器所声明的每个处理程序上。如果我们希望守卫只适用于一个方法我们可以在方法层应用UseGuards() 装饰器。 为了设置全局守卫使用Nest应用程序实例的useGlobalGuards()方法 const app await NestFactory.create(AppModule); app.useGlobalGuards(new RolesGuard());对于混合型应用程序useGlobalGuards()方法默认不为网关和微服务设置守卫关于如何改变这一行为的信息请参见混合型应用程序。对于 “标准”非混合型微服务应用程序useGlobalGuards()确实在全局范围内安装防护。(译者注这里和pipes里面的一样的) 全局守卫在整个应用程序中会作用在每个控制器和每个路由处理程序。在依赖注入方面从任何模块之外注册的全局守卫如上面的例子中使用useGlobalGuards()不能注入依赖因为这是在任何模块的上下文之外进行的。为了解决这个问题你可以使用下面的方式直接从任何模块中设置一个守卫(译者注就是上面直接在app注册的守卫module是引用不到的) import { Module } from nestjs/common; import { APP_GUARD } from nestjs/core;Module({providers: [{provide: APP_GUARD,useClass: RolesGuard,},], }) export class AppModule {}当使用这种方法为守卫进行依赖性注入时请注意无论在哪个模块采用这种方式守卫实际上都是全局性的。这应该在哪里进行呢选择定义了防护上面例子中的RolesGuard的模块。另外useClass并不是处理自定义提供者注册的唯一方法。在这里了解更多。 我们的RolesGuard可以工作了但是它还不够聪明。我们还没有利用最重要的守卫特性–执行上下文。它还不知道角色或者每个处理程序允许哪些角色。例如CatsController可以为不同的路线提供不同的权限方案。有些可能只对管理员用户开放而有些可能对所有人开放。我们怎样才能以一种灵活和可重用的方式将角色与路由相匹配呢 这就是自定义元数据发挥作用的地方在这里了解更多。Nest提供了通过SetMetadata()装饰器将自定义元数据附加到路由处理程序的能力。这个元数据提供了我们缺失的角色数据智能守卫需要这些数据来做出决定。让我们来看看如何使用SetMetadata() Post() SetMetadata(roles, [admin]) async create(Body() createCatDto: CreateCatDto) {this.catsService.create(createCatDto); }SetMetadata()装饰器是从nestjs/common包中导入的。 通过上面的结构我们将角色元数据角色是一个key而[‘admin’]是一个特定的value附加到create()方法中。虽然这很有效但在你的路由中直接使用SetMetadata()并不是好的做法。相反创建你自己的装饰器如下所示 import { SetMetadata } from nestjs/common; export const Roles (...roles: string[]) SetMetadata(roles, roles);这种方法更简洁、更易读而且是强类型的。现在我们有一个自定义的Roles()装饰器我们可以用它来装饰create()方法。 Post() Roles(admin) async create(Body() createCatDto: CreateCatDto) {this.catsService.create(createCatDto); }完善RolesGuard 现在让我们把 RolesGuard 功能完善起来。目前它在所有情况下都简单地返回true允许每个请求继续进行。我们想在比较分配给当前用户的角色和当前正在处理的路由所要求的实际角色的基础上使返回值成为条件。为了访问路由的角色自定义元数据我们将使用Reflector帮助类它是由框架提供的并可以从nestjs/core包中导入。 import { Injectable, CanActivate, ExecutionContext } from nestjs/common; import { Reflector } from nestjs/core;Injectable() export class RolesGuard implements CanActivate {constructor(private reflector: Reflector) {}canActivate(context: ExecutionContext): boolean {const roles this.reflector.getstring[](roles, context.getHandler());if (!roles) {return true;}const request context.switchToHttp().getRequest();const user request.user;return matchRoles(roles, user.roles);} }在node.js世界中通常的做法是将授权用户附加到请求对象中。因此在我们上面的示例代码中我们假设 request.user 包含用户实例和允许的角色。在你的应用程序中你可能会在你的自定义认证防护或中间件中进行这种关联。请查看本章以了解有关这一主题的更多信息。 matchRoles()函数内部的逻辑可以根据需要简单或复杂。这个例子的重点是展示守卫如何融入请求/响应周期。 请参考执行上下文章节的反射和元数据部分了解以上下文敏感的方式利用反射器的更多细节。 当权限不足的用户请求一个端点时Nest自动返回以下响应 {statusCode: 403,message: Forbidden resource,error: Forbidden }请注意当一个守卫返回错误时Nestjs框架会抛出一个ForbiddenException。如果你想返回一个不同的错误响应你应该抛出你自己的特定异常。比如说 throw new UnauthorizedException();由守卫装置抛出的任何异常将由异常层全局异常过滤器和应用于当前上下文的任何异常过滤器处理。 如果你正在寻找一个关于如何实现授权的真实例子请查看本章。 总结 本章节主要内容如下 守卫的主要职责。 守卫的重要特性ExecutionContext(执行上下文)。 守卫的作用范围。 如何建立基于角色的守卫。 利用装饰器封装守卫。 注意本章节代码只是演示代码文中有具体例子的链接。
http://www.w-s-a.com/news/158344/

相关文章:

  • 河北省建设机械会网站首页刚做的网站怎么收录
  • 什么网站专门做自由行的framework7做网站
  • 网页设计与网站建设书籍包头住房与城乡建设局网站
  • 重庆网站建设平台免费猎头公司收费收费标准和方式
  • 形象设计公司网站建设方案书打开一个不良网站提示创建成功
  • 网站手机页面如何做网站关键字 优帮云
  • 免费的黄冈网站有哪些下载软件系统软件主要包括网页制作软件
  • 企业微站系统重庆高端网站建设价格
  • 有没有做衣服的网站吗网站自适应开发
  • 青海省制作网站专业专业定制网吧桌椅
  • 网站开发的项目17岁高清免费观看完整版
  • 手机网站建设多少钱一个门网站源码
  • 重庆 网站开发天津住房和城乡建设厅官方网站
  • 泰安高级网站建设推广厦门高端网站建设定制
  • jsp网站开发引用文献手机seo排名
  • 创建一家网站如何创设计网页的快捷网站
  • 1688代加工官方网站h5开发教程
  • 静态网站源码下载网站怎么显示备案号
  • 网站代码设计网站开发维护任职要求
  • 长寿做网站的电话怎么快速刷排名
  • 上海市中学生典型事例网站邯郸全网推广
  • 厦门网站建设680元好男人的最好的影院
  • 石家庄网站建设设计产品设计专业就业前景
  • 网站移动排名做最好最全的命理网站
  • 网站怎么防黑客杭州市做外贸网站的公司
  • 网站推广公司认准乐云seo易语言做网站登录
  • 配色设计网站推荐网站下拉菜单重叠
  • 内容展示型网站特点在北京注册公司需要多少钱
  • h5网站源代码创意设计理念
  • 岳阳网站开发服务推广运营平台