я)
https://github.com/htchtc052/music-app/tree/main/backend/src/casl
о, крутяк я вот засел за попытку всунуть КАСЛ в свой проект с Призмой, и чёт запутался. - Ability (которая везде в примерах) - нынче deprecated.. - CASL for Prisma - похож на сырой костыль на первый взгляд...
Надо же) и что вместо него) Может выпилить пока не поздно и заменить каким нибудь isOwner в сервисах. тем более оно в основном для этого и нужно
вроде оно все работает. другое дело, что чуток избыточно и для юнит тестов неудобно
Спасибо, посмотрел. Получается, основная логика "кому чего можно" находится в ability.factory и оттуда тянется в Гард (policies.guard), который навешивается на нужные роуты Трека? + вдогонку ещё декоратор @CheckPolicies (но я пока не понял, для чего он)
Да основное кому чему можно в factory а guard проверяет полиции которые назначеные в декораторе. Сейчас попробую подробнее пояснить @CheckPolicies(ReadTrackHandler) Назначило роуту одну полицию ReadTrack далее идем в @UseGuards(PoliciesGuard) там есть return policyHandlers.every((handler) => handler.handle(ability)); Оно предполагает, что полиций может быть много, хотя нафига нужно. но в доках так. Ну мало ли какие случаи Далее он берет этот единственный handler и передает туда обьект ability где и зашиты правила. и которая уже связана именно с текущим authUser который заходит на роут Далее смотрим что внутри хендлера constructor(private track: Track) {} handle(ability: AppAbility) { return ability.can(Action.Read, subject('Track', this.track)); } А там применяем ability от лица authUser к треку куда заходим. Ну будто бы выполняем isOwner на этом треке. А трек берется из DI куда его засовывает провайдер export const ReadTrackProvider: Provider = { provide: ReadTrackHandler, inject: [REQUEST], useFactory: (request: RequestWithTrackInterface) => { const track: Track = request.track; return new ReadTrackHandler(track); }, }; вот в этой строчке return new ReadTrackHandler(track); А сам трек идет из requestWithTrack куда его миддваре по id роута запихнуло async use(req: RequestWithTrack, res: Response, next: NextFunction) { const id = parseInt(req.params.id); /// const track: Track = await this.tracksService.findWithFileById(id); .// req.track = track; next(); }
Обсуждают сегодня