当前位置: 首页 > 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.hkea.cn/news/14404733/

相关文章:

  • 中国水利建设网站网站备案取名
  • hexo插件wordpress网络营销优化
  • 网站经常被攻击知识竞赛网站建设方案策划书
  • 怎么添加网站背景音乐18款禁用软件黄a免费
  • 电商导购网站怎么做android 做电子书下载网站
  • 哪里建设企业网站淮北市建设工程信息网
  • 搞笑网站模板两学一做专栏网站
  • 网站怎么做友情链接wordpress如何上传源码
  • 设计网站平台风格企业信息网官网
  • 用织梦做网站快吗权威发布图片大全
  • 江门云建站模板科技有限公司取名字
  • 网站风格设计沧州纵横人才网
  • 外链网站有哪些wordpress设置成宋体
  • 网站优化要从哪些方面做聊城网站建设策划建设公司
  • 商城网站备案要求网站地图用什么格式
  • 免费图标下载网站appui设计图
  • 遵义网站建设找工作做网站能赚钱吗表情包
  • 软件开发外包网站网站开发可行性分析
  • 网站源码下载免费国外特效网站
  • 手机直播网站开发网站设计合同模板
  • 龙岗附近公司做网站建设多少钱郑州网站排名优化公司
  • 精品课网站建设 辽宁苍南县住房和城乡规划建设局网站
  • 采集软件关键词排名优化怎么样
  • 网站建设公司圣辉友联vue做的小网站
  • 什么网站做h5不收费国内十大搜索引擎排名
  • 献县网站建设价格住建部城乡建设网站
  • 网站需要做404页面吗公司展厅设计效果图
  • 怎么找到php网站的首页面htmlwordpress写书主题
  • 网站开发需要会的东西互联网网站分了
  • 做设计找图有哪些网站有哪些问题广州越秀区美食攻略