验证(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来管理使用者权限
这部份下一章继续
tuiguang.png推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。
网友评论