对守卫使用OR语句

时间:2018-11-01 20:10:02

标签: nestjs

我想做的是功能类似的东西(当然,下面的代码是胡说八道):

@UseGuards( AuthGuard || AdminAuthGuard )

我希望我的警卫只有在双方都返回假的情况下才为假。基本上,我希望我的身份验证防护像OR语句一样,因为端点可以由多个独立的源激活,并且每个源都有自己的身份验证系统。

当然,我可以将这两个auth合并到同一函数中。问题在于代码会变得混乱,因为在某些情况下,我需要单独使用它们中的每一个,并且我不希望彼此重叠。

任何人都知道如何实现这样的行为吗?

PS:另外,作为额外的复杂性,我将RoleGuards与两个登录系统之一一起使用。因此,例如,如果AdminAuth为true,则应用RoleGuards,但如果正常Auth为true,则不应用RoleGuards。

解决方案:这是我解决此问题的方法(我仍然不知道是否有简单的nestjs方式。如果您愿意,我想知道;)。 在我的原始防护中,我导出了validateRequest函数。我创建了一个称为adminOrNormalAuthGuard的身份验证保护。在其中导入函数并实现所需的逻辑。

对于roleGuard,我正在做的就是导入那些验证函数。如果登录正常=>返回true。如果特殊的login =>结果取决于警卫逻辑。

1 个答案:

答案 0 :(得分:0)

由于这似乎与身份验证有关,您可以按照此处看到的文档中的推荐行为进行操作:https://docs.nestjs.com/security/authentication#extending-guards

基本上你可以做的是扩展一个由多种策略组成的 AuthGuard:

export class MyAuthGuard extends AuthGuard(['strategy_1', 'strategy_2', '...']) { ... }

然后,您只需将新的“MyAuthGuard”保护设置为您的路线。

如果第一个策略失败,则使用下一个策略,直到所有策略失败或成功。