美文网首页让前端飞Web前端之路
Nest.js学习之路(11)-Guard(Authentica

Nest.js学习之路(11)-Guard(Authentica

作者: cbw100 | 来源:发表于2019-06-17 01:14 被阅读4次

    验证(authentication)部分在nest.js也是跟Angular借Guard这一套来使用,authentication逻辑需要另外建立class并实现CanActivate接口

    CanActivate仅需实现canActivate方法回传:

    • true 允许client存取资源
    • false 丢出UnauthizedException

    假设来源是localhost才有权限新增平台

    建立auth.guard.ts

    import { Injectable, CanActivate, ExecutionContext, Logger } from '@nestjs/common';
    import { Observable } from 'rxjs';
    
    @Injectable()
    export class AuthGuard implements CanActivate{ // 实现CanActive接口
        canActivate(
          context: ExecutionContext, // 可以取得对应controller及request/request信息
        ): boolean | Promise<boolean> | Observable<boolean> {  // 回传boolean类型,支持非同步
    
          // 验证逻辑
          const req = context.switchToHttp().getRequest(); // 取得request对象
          const ctrl = context.getClass();
    
          Logger.log(`Controller Name: ${ctrl.name}`);
          const handler = context.getHandler(); // nest.js利用reflect metadata取得存取资源对应的方法
          Logger.log(`Method Name: ${handler.name}`);
          if (req.hostname === 'localhost'){
            Logger.log(`Requested From: ${req.hostname}`);
            return true;
        }
          return false;
        }
    }
    

    用@UseGuards註冊AuthGuard

    app.controller.ts

    @Controller()
    @UseGuards(AuthGuard)
    @UseFilters(HttpInterceptorException)
    export class AppController {
      ...
      @Post()
      @UsePipes(PlatformDTOValidationPipe)
      create(@Body() platformDTO: PlatformDTO){
        return `平台:${platformDTO.platformname}已建立`;
      }
      ...
    }
    

    使用postman测试


    20181110507.png

    console output


    2018110604.png

    前面的例子用主机/IP来决定存取权限,比较少见
    通常使用role/group来管理使用者权限

    这部份下一章继续

    推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。

    tuiguang.png

    相关文章

      网友评论

        本文标题:Nest.js学习之路(11)-Guard(Authentica

        本文链接:https://www.haomeiwen.com/subject/aoiyxqtx.html