您可以通过在有效负载中指定一个角色来做到这一点,通过这个角色,您可以在每个端点上设置一个保护,哪个角色可以访问它。我举个例子:
我相信你有一个函数可以填充你的 payload 这种函数:
createJwtPayload(user){
let data: JwtPayload = {
userData: user,
companyId : user.company.id,
role:user.role.name, // for us this where we specify the role for our User
};
......
}
现在我们必须创建需要为 x 个端点指定访问权限的守卫
让我们从 Admin Guard 开始:
@Injectable()
export class AdminGuard implements CanActivate {
async canActivate(context: ExecutionContext): Promise<boolean> {
const request = context.switchToHttp().getRequest();
if (!request.headers.authorization) {
return false;
}
request.user = await this.validateToken(request.headers.authorization);
if( request.user.role == ROLES.SUPER_ADMIN) {
return true;
}
return false;
}
async validateToken(auth: string) {
......
}
让我们做第二个后卫,我们称之为EmployeGuard:
....
@Injectable()
export class EmployeGuard implements CanActivate {
async canActivate(context: ExecutionContext): Promise<boolean> {
const request = context.switchToHttp().getRequest();
if (!request.headers.authorization) {
return false;
}
request.user = await this.validateToken(request.headers.authorization);
if( request.user.role == ROLES.COMPANY_ADMIN || request.user.role == ROLES.USER) {
return true;
}
return false;
}
async validateToken(auth: string) {
......
}
现在要使用这些防护,我们只需要在端点中使用 @UseGuards() 即可:
@Post()
@UseGuards(AdminGuard)
async addCompany(@Res() res, @Body() createDto: CompanyDto) {
........
}
@Get(':companyID')
@UseGuards(EmployeGuard)
async getcompany(@Res() res, @Param('companyID') companyID) {
....
}
奖励:您可以在控制器上@useGuards 以确保所有端点都使用它