基于 RBAC 的授权
ts
import { SetMetadata } from "@nestjs/common";
// 角色定义
export enum Role {
User = "user",
Admin = "admin",
}
// 元数据定义
export const ROLES_KEY = "roles";
export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles);
ts
// 在控制器中, 给路由处理函数附加元数据
@Controller('person')
export class PersonController() {
@Roles(Role.Admin)
@UseGuards(AuthGuard, RolesGuard) // 用户登录守卫, 角色权限守卫
@Post('create')
create() {
// logic...
// 经过路由守卫后, 当前用户具有要求的角色, 执行路由逻辑
}
}
ts
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
/**
* describe: 通过 reflector 来获取路由处理函数或者控制器 Class 上附加的元数据
* 有针对性的对于某些路由处理函数进行覆盖: 使用 getAllAndOverride
* 如果需要合并: 使用 getAllAndMerge
* 如果只是简单的读取: 使用 get
*/
const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
context.getHandler(),
context.getClass(),
]);
// logic...
// 检查当前用户是否符合角色, 进行拦截或放行
}
}