您需要首先从概念上解决这个问题。
我认为您应该编写一个能够计算特定合约的特定用户是什么的方法。
超级简单的例子:
getUserRoleForContract(user: User, contract: Contract): ROLES {
// your logic goes here
if (contract.contractor.id === user.id) {
return ROLES.CONTRACTOR;
} else if (...) {...}
return null;
}
在你的守卫中,从上下文中,你知道哪个用户和合约请求是关于哪个用户和合约请求,利用此方法获取 ROLE,然后将结果与请求的角色进行比较。
现在,您明确表示您不想使用这种方法(检查用户和合同的每个组合)。
我认为你应该改进这一点getUserRoleForContract
现在,基于您对实体关系的了解,实施方法。
从你的问题中,我看到承包商和主管。此拟合基于该(有限)信息:
getUserRoleForContract(user: User, contract: Contract): ROLES {
const allAvailableRoles = [ROLES.CONTRACTOR, ROLES.SUPERVISOR];
for (let role of allAvailableRoles) {
if (contract[role.toLowerCase()].id === user.id) {
return role;
}
return null;
}
这将在假设合约上的每个用户关系实际上是 ManyToOne 且名称与 ROLE 名称相同但小写的情况下起作用(并且假设 ROLES 枚举值是相同的大写字符串)。
总而言之,我希望这对您有所帮助并回答问题。
EDIT2:我修复了 this 指向的 URL。
我刚刚把答案放在这里:为 Nestjs 创建 isAuthor 防护的最佳方法是什么? https://stackoverflow.com/questions/72917725/what-would-be-the-best-way-to-create-an-isauthor-guard-for-nestjs/73885562#73885562。它涵盖了 Nest.js 中 RBAC 的更大解决方案(包括此场景)。