NestJS权限守卫全局生效问题:如何仅在标注装饰器的路由生效?
问题解答
当前情况是否正常?
不正常。将PermissionGuard注册为APP_GUARD全局守卫后,它会拦截所有请求,但你的守卫逻辑中,当未获取到permissions元数据时直接抛出FORBIDDEN异常,导致所有未标注@Permissions的路由都被禁止访问,这不符合“仅在添加装饰器的路由生效”的需求。
如何让守卫仅在添加@Permissions装饰器的路由上生效?
修改PermissionGuard的canActivate方法逻辑:当未获取到权限元数据时,直接返回true允许请求通过,仅在存在元数据时才执行权限校验。
修改后的守卫代码:
@Injectable() export class PermissionGuard implements CanActivate { constructor(private reflector: Reflector) {} canActivate( context: ExecutionContext, ): boolean | Promise<boolean> | Observable<boolean> { const requirePermissions = this.reflector.getAllAndOverride< PermissionEnum[] >('permissions', [context.getHandler(), context.getClass()]); // 没有权限元数据,直接允许请求通过 if (!requirePermissions) { return true; } // 存在权限元数据时,执行你的权限校验逻辑 const user = context.switchToHttp().getRequest(); // 替换为实际校验逻辑,比如判断用户权限是否包含目标权限 // 示例:return user.permissions.some(p => requirePermissions.includes(p)); return false; // 此处保留原返回值,请根据实际需求替换 } }
补充说明
此前单个路由标注@Permissions无效的原因是:你仅添加了元数据装饰器,但未通过@UseGuards(PermissionGuard)在路由上绑定守卫,导致守卫逻辑未被触发。现在注册为全局守卫后,只需调整上述逻辑即可实现按需校验。
内容的提问来源于stack exchange,提问作者Владислав
相关产品推荐
相关产品推荐

