验证 (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
来源: http://www.jianshu.com/p/736f6024ebc1