Spojíte účet, oprávnenie, klasifikáciu, vlastníctvo a platnosť relácie.
Praktický CEL4 testovacie prípadyZdokumentované
Čo si precvičím?
Viete samostatne zostaviť a obhájiť komplexné autorizačné pravidlo.
Ako sa riešenie overí?
Jeden výraz musí vrátiť očakávaný výsledok pre všetky štyri vstupy JSON.
Kedy som hotový?
Keď prejdú všetky testy a viete vysvetliť každú podmienku vo výraze.
Slovná úloha
Povoľte akciu iba aktívnemu a nepozastavenému používateľovi, ktorý má oprávnenie na akciu aj prístup ku klasifikácii, je vlastníkom alebo správcom a má nevypršanú reláciu.
Presné požiadavky
Stav účtu, oprávnenie a klasifikácia sú povinné.
Vlastníctvo a rola správcu sú alternatívy.
Aktuálny okamih musí byť prísne pred vypršaním relácie.
Žiadna úspešná podmienka nesmie obísť inú povinnú podmienku.
Požadovaný výsledok
Napíšte jeden výraz CEL. Musí vrátiť očakávanú hodnotu aj typ pre všetky štyri pripravené vstupy JSON. Vstupy nemeňte tak, aby prešiel neúplný výraz.
Odporúčaný postup
Každú očíslovanú požiadavku preložte na jednu malú logickú podmienku.
Spustite počiatočný výraz a zistite, ktoré prípady neprešli.
Pridávajte vždy jednu podmienku a znova spustite celú testovaciu sadu.
Úlohu označte za dokončenú až vtedy, keď viete vysvetliť každý operátor a každú hranicu.
Vyriešte úlohu · testovacia sada v prehliadači
Napíšte jeden výraz, ktorý prejde všetkými prípadmi
Upravte výraz CEL a potom ho spustite nad všetkými pripravenými vstupmi JSON. Riešenie je hotové až vtedy, keď prejdú všetky prípady.
4 testovacie prípady
Pomôcka: Každá povinná podmienka je spojená pomocou &&; iba vlastníctvo a rola admin sú alternatívy.
Tip: všetky testy spustíte aj klávesmi Ctrl/⌘ + Enter.
Rovnaký výraz sa spustí nad každým prípadom. Testovacie údaje sú pevné, takže nemožno vynechať hranice ani chybové situácie.
Vysvetlené riešenie
Zobraziť celý výraz
user.active && !user.suspended && action in user.permissions && resource.classification in user.allowedClassifications && (resource.ownerId == user.id || user.roles.exists(role, role == 'admin')) && timestamp(now) < timestamp(session.expiresAt)
Prečo riešenie funguje
Prvé štyri podmienky validujú účet a deklarované zoznamy prístupov.
Zátvorky izolujú alternatívu vlastník alebo správca.
exists() hľadá v zozname rolí hodnotu admin.
Posledné porovnanie časových pečiatok odmietne reláciu presne v čase vypršania aj po ňom.
Čo dokazujú testovacie prípady
Aktívny vlastník: očakáva sa true (bool).
Správca nie je vlastník: očakáva sa true (bool).
Chýbajúce oprávnenie: očakáva sa false (bool).
Relácia vypršala: očakáva sa false (bool).
Prípady sú zámerne rozdielne. Riešenie, ktoré prejde iba prvým prípadom, ešte nezapracovalo celé pravidlo.
Častá chyba
Výraz neprispôsobujte iba prvému úspešnému vstupu. Požiadavka je zapracovaná až vtedy, keď kladný, záporný aj hraničný prípad vytvoria určený výsledok.
Kontrolná otázka
Viete ukázať presnú časť riešenia, ktorá spôsobí zlyhanie každého nepravdivého testu? Ak dve rozdielne zlyhania závisia od rovnakej podmienky, vysvetlite prečo.
Hlavná myšlienka
Viete samostatne zostaviť a obhájiť komplexné autorizačné pravidlo.
Zdroje
CEL-DEV — oficiálny prehľad CEL.
CEL-LANG — oficiálna definícia jazyka CEL pre operátory, typy, makrá, prítomnosť, reťazce a časové hodnoty použité v tejto úlohe.