A szoftverfejlesztés automatizált folyamataiban különösen fontos, hogy a fejlesztett kód minősége garantált legyen, mielőtt az eljut a produkciós környezetbe. Az úgynevezett gated deployment, vagyis a jóváhagyáson alapuló telepítés, olyan megközelítés, ahol a telepítés csak akkor folytatódhat, ha egy illetékes személy előzetesen engedélyezi azt. Ez a folyamat kulcsfontosságú a stabilitás és a hibamentes üzemeltetés fenntartásához.
A CircleCI rendszerében a munkafolyamatokat (workflow-kat) úgy definiálhatjuk, hogy a különböző lépések meghatározott sorrendben és feltételekkel fussanak le. Például egy egyszerű konfigurációban a build lépés után egy „hold” típusú, jóváhagyást igénylő lépés következik, amely csak akkor engedi tovább a telepítést, ha azt egy döntéshozó jóváhagyja. Ez az elrendezés nemcsak a telepítés szabályozását teszi lehetővé, hanem segít abban is, hogy csak megfelelően tesztelt és ellenőrzött kód kerüljön produkciós környezetbe.
Bonyolultabb munkafolyamatokban a build és a teszt lépések párhuzamosan futnak, és csak akkor kerül sor a jóváhagyásra, ha mindkettő sikeresen befejeződött. Továbbá, az alkalmazott ágfilterezés biztosítja, hogy a telepítés kizárólag a fő (main) ágra történt összefésülés után induljon el, így támogatva a GitHub flow gyakorlatot, amely a kód integritását és folyamatos minőségét szolgálja.
A minőségbiztosítás másik sarkalatos pontja a kódlefedettség (code coverage) elemzése. Ez egyfajta mérőszám, amely megmutatja, hogy az egységtesztek a kód mekkora részét fedik le. Az Angular projektekben például a ng test --code-coverage parancs segítségével generálhatók ilyen riportok, melyek HTML formátumban részletesen bemutatják a tesztek lefedettségét mappákra, fájlokra, sőt adott sorokra bontva is. Az így nyert információk segítségével azonosíthatóak a tesztelés hiányosságai, és célzottan fejleszthetők a hiányzó tesztek.
A CI rendszerben a kódlefedettségi riportok generálása és tárolása automatikusan történik minden build során, így a lefedettségi mutató egy fontos minőségi kapu (quality gate) lehet, amely megakadályozza, hogy a lefedettség csökkenése miatt gyengébb minőségű kód kerüljön a fő ágra. A Coveralls szolgáltatás például integrálható a CircleCI pipeline-ba, és közvetlenül a GitHub pull requestekhez csatolva mutatja a lefedettségi adatokat, így könnyen áttekinthetővé téve a minőségi állapotot.
A konfiguráció során fontos, hogy a CI/CD környezet biztonsági beállításai lehetővé tegyék az orb-ok (előre definiált funkcionális egységek) futtatását, valamint hogy a megfelelő környezeti változók, például a Coveralls repo tokenje biztonságosan legyen tárolva. A pipeline-on belüli teszteredmények és lefedettségi adatok tárolása, továbbá az automatikus feltöltés a felhőszolgáltatásba biztosítják a folytonos minőségellenőrzést.
Ez a fajta komplex és jól átgondolt CI/CD megközelítés, amely ötvözi a fejlesztés automatizálását, a minőségbiztosítás szigorú kontrollját és a telepítési jóváhagyások beépítését, elengedhetetlen a professzionális szoftverfejlesztési életciklusokban. Együtt alkalmazva ezek az eszközök hozzájárulnak a stabil, megbízható és gyorsan reagáló fejlesztési folyamathoz, amely a modern DevOps kultúra alapját képezi.
Fontos megérteni, hogy a gated deployment és a kódlefedettségi metrikák nem csupán technikai eszközök, hanem a fejlesztői felelősség és a minőségkultúra eszközei is. A megfelelően beállított jóváhagyási folyamat és a folyamatos lefedettség-ellenőrzés lehetővé teszi a csapat számára, hogy korán észleljék a potenciális problémákat, csökkentsék a hibák számát, és fenntartsák a magas minőségi szintet hosszú távon is. Ezek nélkülözhetetlenek a folyamatos integráció és szállítás sikeres megvalósításához, valamint a projekt hosszú távú fenntarthatóságához.
Hogyan működik a token alapú hitelesítés és miért fontos a stateless architektúra?
A token alapú hitelesítés az egyik legelterjedtebb módszer a modern webalkalmazások biztonságos hozzáférés-ellenőrzésére. Az eljárás egy elosztott, állapot nélküli autentikációs folyamatot valósít meg, amely a felhasználói élményt és az alkalmazás skálázhatóságát jelentősen javítja. A rendszerben használt JSON Web Token (JWT) képes azonosítani a felhasználókat anélkül, hogy a szervernek nyomon kellene követnie a felhasználói munkamenetet. A hitelesítés folyamata egyszerűsödik, mivel minden kérés a felhasználó egyedi, titkosított tokenjét tartalmazza, így a szerver minden interakciót önállóan képes ellenőrizni.
A legfontosabb előnye ennek az architektúrának, hogy a rendszert nem terheli a felhasználók munkamenetének követése. A felhasználók több eszközön és böngészőablakban is egyidejűleg használhatják az alkalmazást, miközben a rendszer nem tárolja a munkamenethez kapcsolódó adatokat. A JWT segítségével az autentikáció egyszeri folyamatként működik, és a felhasználó ezután bármikor hitelesített kéréséhez újra beavatkozás nélkül hozzáférhet a rendszerhez. Fontos azonban, hogy a tokeneknek van lejárati idejük, és mivel elosztott rendszeren alapulnak, nem lehet őket távolról vagy egyedileg visszavonni. Ennek ellenére a rendszer biztonságát megerősíthetjük azzal, ha valós időben ellenőrizzük a felhasználó státuszát és jogosultságait, biztosítva, hogy csak azok férjenek hozzá az érzékeny adatokhoz, akik valóban jogosultak rá.
A JWT-ket az Internet Engineering Task Force (IETF) által meghatározott RFC 7519 szabvány szerint alakítják ki, amely az internetes hitelesítési és adatvédelmi protokollok ipari sztenderdje. A jó hitelesítési rendszer kulcsfontosságú része a felhasználói szerepek alapján történő navigáció biztosítása, hogy minden felhasználó csak azokhoz az oldalakhoz és funkciókhoz férjen hozzá, amelyek a szerepéhez tartoznak. Azonban fontos megjegyezni, hogy a kliens oldali szerepalapú navigáció csupán kényelmi funkció, és nem szabad biztonsági megoldásként kezelni. A felhasználónak a rendszer minden kérésére tartalmaznia kell a megfelelő hitelesítési fejléceket, beleértve a titkosított tokent, hogy a szerver újra hitelesíthesse őt, és ellenőrizhesse a szerepét.
A jelszó alapú visszaállító képernyők biztonságos megvalósítása különösen nagy kihívást jelenthet, hiszen ezek a képernyők elérhetők lehetnek az alkalmazásból, vagy egy e-mailben/értesítésben található linken keresztül is. A növekvő interakciós felület nagyobb támadási felületet is jelent, így ajánlott a visszaállító képernyőket szerveroldali renderelés segítségével megvalósítani, hogy mind a felhasználó, mind a szerver biztosan megerősíthesse a felhasználó hitelesítését. Ha azonban kliensoldalon valósítjuk meg ezt, akkor a szervernek biztosítania kell, hogy egy időkorlátos, egyszer használatos token kerül generálásra a jelszó mellett, így biztosítható, hogy a kérés valóban hiteles.
A biztonságos rendszerek alapja az, hogy az adatok a felhasználók és a szerverek között titkosítva kerülnek továbbításra. A Transport Layer Security (TLS), vagyis az SSL újabb verziója, biztosítja, hogy a felhasználói hitelesítő adatok ne kerüljenek kiszivárgásra. A REST API-nknak HTTPS-en keresztül kell kiszolgálnia az összes kérést, hogy az adatátvitel biztonságos legyen. Ezen kívül minden adatbázis vagy harmadik fél szolgáltatással történő kommunikáció során is biztosítani kell a TLS használatát.
A rendszerben tárolt érzékeny adatokat, mint például a személyes azonosító információkat (PII), kétirányú titkosítással kell védeni. Az adatokat nemcsak a tárolás során kell titkosítani, hanem ha a rendszer bármilyen módon kompromittálódik, a titkosított adatokat nem lehet könnyen hozzáférhetővé tenni. Fontos, hogy a rendszer minden adatát titkosított csatornán küldje és fogadja, így megakadályozható, hogy a hálózaton való átvitel során bárki hozzáférjen az érzékeny információkhoz.
A legfontosabb biztonsági rétegzés alkalmazása kulcsfontosságú, mivel a támadóknak minden réteget egyszerre kellene kompromittálniuk ahhoz, hogy valóban kárt tudjanak okozni a rendszerben. Nagy adatlopásokat gyakran a nem megfelelő titkosítási gyakorlatok vagy a gyenge külső védelmi rendszerek okoznak. Ha a támadó sikeresen áttöri a rendszer egy rétegét, a következő védekezési vonalon is komoly biztonsági mechanizmusoknak kell állniuk.
A JWT életciklusa a következő módon zajlik: Miután a felhasználó bejelentkezett és megadta a felhasználónevét és jelszavát, a hitelesítési státusz és a szerepkör titkosítva kerül a JWT-be, amely lejárati idővel rendelkezik. Ezután a token visszakerül a böngészőbe, amely a helyi tárolóban (localStorage vagy sessionStorage) biztonságosan tárolja azt, így nem szükséges újra bejelentkezni minden egyes kéréshez.
A jól megtervezett és megfelelően implementált token alapú hitelesítési rendszer nemcsak a felhasználói élményt javítja, hanem alapvetően hozzájárul az alkalmazás biztonságához és skálázhatóságához is. A szerveroldali hitelesítési logika alkalmazása garantálja, hogy a felhasználó jogosultságait a rendszer mindig valós időben ellenőrizze, és megakadályozza a biztonsági rések kihasználását.
Hogyan valósítsuk meg az alkalmazás navigációs menüjét szerepkör-alapú hozzáféréssel?
A navigációs menü megvalósítása az alkalmazásokban kulcsfontosságú eleme az interaktív felhasználói élménynek, különösen, ha a navigációs lehetőségek szerepkör-alapúak. Ez azt jelenti, hogy a felhasználók hozzáférése eltérő funkciókhoz és szakaszokhoz változik attól függően, hogy milyen szerepet töltenek be a rendszerben. Az alábbiakban bemutatjuk, hogyan készíthetjük el az oldal navigációs menüjét Angular keretrendszerben, amely dinamikusan reagál a felhasználói hitelesítés állapotára és az eszköz kijelzőméretére.
A navigációs menü megvalósításához először hozzuk létre a NavigationMenu komponenst, amely tartalmazza a szükséges sablonokat és stílusokat. Ez lehetővé teszi, hogy a navigációs menüt egyszerűen lehessen karbantartani és bővíteni a jövőben, miközben különálló komponensként működik az alkalmazásban. A menü nem szükséges, amíg a felhasználó be nem jelentkezik, de a menü aktiválásához és vezérléséhez elengedhetetlen a AppComponent-ban történő indítás.
A felhasználói felület kialakítása
Az alkalmazás gyökérkomponensében a következő lépéseket kell követni:
-
Stílusok beállítása: Az alkalmazás teljes képernyős megjelenítéséhez, valamint a mobil és asztali eszközök közötti különbségek kezeléséhez különféle CSS osztályokat alkalmazunk. Például a
flexelrendezéssel a menü és a tartalom megfelelően jeleníthető meg. Mobil eszközök esetén a navigációs menü fix pozícióban lesz, hogy a felhasználói élmény zökkenőmentes legyen. -
Dinamikus nyitás és zárás: A
MediaObserverszolgáltatás segítségével figyeljük a kijelzőméret változásait, így a menü automatikusan alkalmazkodik az eszközhöz. Ha a felhasználó mobil eszközt használ, a navigációs menü automatikusan zárva marad, míg asztali nézetben a menü nyitva lesz. Az autentikációs státusz figyelembevételével a menü dinamikusan válik láthatóvá vagy rejtetté a bejelentkezett felhasználók számára. -
A nyitott/zárt állapot kezelése: Az alkalmazás dinamikusan követi a hitelesítési státuszt (
authStatus$) és a képernyő méretét. Amikor a felhasználó bejelentkezik, a menü láthatóvá válik, míg ha kijelentkezik, akkor eltűnik. Ez a logika biztosítja a megfelelő felhasználói élményt minden eszközön és minden felhasználói szerepkörnél.
Szerepkör alapú navigáció
Mivel az alkalmazásunkban különböző felhasználói szerepek vannak, fontos, hogy a navigációs menü linkjei is dinamikusan változzanak ezen szerepek szerint. A szerepkörök és a hozzájuk tartozó jogosultságok alapján jeleníthetjük meg az egyes menüpontokat, például a Manager szerep esetén a "Users" és a "Receipts" linkeket, míg a Clerk szerep esetén a "POS" linket.
A navigációs linkeket a NavigationMenuComponent komponensben célszerű megvalósítani. Az ilyen komponensek előnye, hogy nem növelik a fő alkalmazáskomponens (pl. AppComponent) méretét, így a kód könnyebben karbantartható. Az Angular Router segítségével biztosítható, hogy a linkek megfelelően irányítsák a felhasználókat a különböző alkalmazási szakaszokhoz.
Mobil- és asztali eszközökhöz való alkalmazkodás
A mobil eszközökön való navigációs élmény optimalizálása érdekében fontos, hogy a menü responszív legyen. A mat-sidenav komponens segítségével a navigációs menü oldalról csúszik be a mobil eszközökön, míg asztali eszközökön a tartalom mellé helyezkedik el. A MediaObserver-t alkalmazva figyeljük a képernyő méretét és a felhasználói interakciókat, így biztosítva, hogy a menü viselkedése a megfelelő módon alakuljon.
A navigációs komponensben fontos figyelembe venni a különböző felhasználói szerepeket, és biztosítani, hogy a linkek csak az adott szerepkörhöz tartozó felhasználók számára legyenek elérhetők. Így a NavigationMenuComponent szerepe kiemelkedően fontos, hogy a menü tartalmát csak az arra jogosult felhasználók láthassák.
A felhasználói élmény javítása érdekében ajánlott a navigációs menüt az eszközökön testreszabni, így biztosítva, hogy minden felhasználó számára intuitív és könnyen használható legyen.
Hogyan alakíthatjuk ki az alkalmazásunkban a felhasználói űrlapok dinamikus kezelését és az adatok gyorsítótárazását?
A felhasználói élmény javítása érdekében rendkívül fontos, hogy az alkalmazásunk képes legyen kezelni a felhasználói adatokat úgy, hogy közben zökkenőmentesen frissíti azokat, még akkor is, ha a felhasználó ideiglenesen offline állapotba kerül. Az alábbiakban bemutatjuk, hogyan építhetjük be a felhasználói űrlapok dinamikus kezelését és az adatok gyorsítótárazását a frontend alkalmazásunkba.
Amikor a felhasználó belép az alkalmazásba, a rendszer képes automatikusan betölteni a hozzá tartozó adatokat. Ehhez használhatjuk a mat-card-content komponensbe helyezett címkéket, amelyek megjelenítik a hitelesítési módot, például a következő módon:
Ezután a felhasználói információk megjelenítésére egy bővíthető listát hozhatunk létre, amely lehetővé teszi a jelszóval kapcsolatos bonyolultság követelményeinek kommunikálását. A jelszó komplexitását egy táblázat segítségével adhatjuk meg, amely tartalmazza a szerepköröket és az e-mail címeket, például az alábbi kód szerint:
Ez a kód lehetővé teszi a felhasználó számára, hogy gyorsan kitöltse a bejelentkezési adatokat egy előre definiált szerepkör és e-mail cím alapján. A colspan és az fxLayoutAlign direktívák segítségével vezérelhetjük az egyes cellák szélességét és az e-mail oszlop tartalmának igazítását. Az @if; @else vezérlési áramlatokkal egyes tartalmakat ki- és bekapcsolhatunk, így növelhetjük az űrlap dinamikusságát.
Az adatok gyorsítótárazása szintén kiemelkedő szerepet kap. A felhasználói adatok kezelésére létrehozott updateUser metódus segítségével elmenthetjük az adatokat a gyorsítótárba, hogy akkor is megőrizzük őket, amikor a felhasználó átmenetileg offline módban van. Ehhez a következő kódot alkalmazhatjuk:
A gyorsítótár segítségével akkor is elérhetjük a felhasználó által megadott adatokat, ha a hálózati kapcsolat megszakadna. A ProfileComponent komponensben a loadFromCache metódus segítségével betölthetjük az adatokat a gyorsítótárból:
Ez biztosítja, hogy ha a felhasználó visszatér az alkalmazásba, a legutóbbi munkamenetéhez tartozó adatokat újra betöltheti. A gyorsítótár kezelése mellett az alkalmazásban található Reset gombbal törölhetjük az adatokat, és biztosíthatjuk, hogy a gyorsítótár is törlődjön, ha a felhasználó úgy dönt, hogy új adatokat ad meg:
A ngOnInit metódusban a gyorsítótárból vagy az aktuális felhasználói adatokból tölthetjük be az adatokat:
Ez a kód lehetővé teszi, hogy a felhasználói adatok gyorsítótárból vagy az aktuális felhasználó adataiból töltsenek be dinamikusan, és így az alkalmazás minden helyzetben képes legyen biztosítani a legfrissebb információkat.
A gyorsítótár implementálása összetett feladat, mivel számos szélsőséges eset is előfordulhat, például amikor az adatokat nem sikerül elmenteni a szerverre, és a gyorsítótárban ragadnak. Az offline állapotok kezelése ezért különös figyelmet igényel. Bár egy egyszerű gyorsítótárazási megoldás is kielégítő lehet az alapvető használati esetekre, a fejlettebb alkalmazások esetében a gyorsítótár tisztán tartásáról és az adatok szinkronizálásáról gondoskodnunk kell.
A fejlesztés során figyelni kell arra is, hogy a formák responszívan működjenek különböző képernyőméreteken, és hogy az űrlapok újrafelhasználható komponensekké váljanak. A kontrollertől a vizuális elemekig minden egyes részt optimalizálni kell, hogy az alkalmazás különböző helyzetekben is megfelelően működjön. A ControlValueAccessor interfész használatával például könnyedén integrálhatunk egyedi formázásokat, mint a "lemon rater", az űrlapunkba.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский