Tenho as seguintes habilidades definidas em CaslAbilityFactory
:
if (auth.isAdmin) {
can(Action.Create, User);
can(Action.Read, "all");
can(Action.Manage, User);
can(Action.Update, User, ["email", "firstName", "lastName", "role"]);
can(Action.Delete, User);
cannot(Action.Delete, User, isOwner);
}
if (auth.isUser) {
can([Action.Read, Action.Update], User, isOwner);
}
Então, defini o seguinte resolver:
@Mutation(() => User)
@UseGuards(PoliciesGuard)
@CheckPolicies(ability => ability.can(Action.Update, User))
async updateUser(
@Args("input") input: UpdateUserInput,
@CurrentAuth() auth,
): Promise<User> {
const ability = this.caslAbilityFactory.createForAuth(auth);
if (ability.cannot(Action.Update, { id: input.id }) {
throw new ForbiddenException();
}
return this.usersService.update(input.id, input);
}
O @CheckPolicies
decorador garante corretamente que apenas um usuário com a Update
ação para usuários pode chamá-lo, mas preciso afirmar que para este específico, posso atualizá-lo? Se o solicitante for o proprietário, ele pode. Mas como você verifica isso antes de carregar o usuário?
Uma solução óbvia é carregar o usuário, executar a verificação e, então, executar a atualização. Outra solução mais hackeada seria, de alguma forma, fazer o cast new User({ id })
e executar a verificação.
Existe uma solução melhor para isso?
Obrigado,