Nest.js学习之路(11)-Guard(Authentication) in nest.js(上)

验证(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 | Observable {  // 回传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测试


Nest.js学习之路(11)-Guard(Authentication) in nest.js(上)_第1张图片
20181110507.png

console output


Nest.js学习之路(11)-Guard(Authentication) in nest.js(上)_第2张图片
2018110604.png

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

这部份下一章继续

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

tuiguang.png

你可能感兴趣的:(Nest.js学习之路(11)-Guard(Authentication) in nest.js(上))