Izgradnja osnovnog JHipster mikroservisa osiguranog za UAA

1. Pregled

U prethodnim člancima pokrivali smo osnove JHipstera i kako ga koristiti za generiranje aplikacije temeljene na mikrouslugama.

U ovom vodiču, istražit ćemo JHipsterov korisnički račun i uslugu autorizacije - UAA ukratko - i kako ga koristiti za osiguravanje punopravne aplikacije mikroservisa temeljene na JHispteru. Još bolje, sve se to može postići bez upisivanja ijednog retka koda!

2. Osnovne značajke UAA

Važna značajka aplikacija koje smo izgradili u našim prethodnim člancima jest da su korisnički računi bili njihov sastavni dio. Ovo je u redu kada imamo jednu aplikaciju, ali što ako želimo dijeliti korisničke račune između više aplikacija generiranih JHipsterom? Ovdje dolazi JHipsterov UAA.

JHipsterova UAA je mikroservis koji je izgrađen, postavljen i pokrenut neovisno o ostalim uslugama u našoj aplikaciji. Služi kao:

  • OAuth2 poslužitelj za autorizaciju, zasnovan na implementaciji Spring Boota
  • Poslužitelj za upravljanje identitetima koji izlaže CRUD API korisničkog računa

JHipster UAA također podržava tipične značajke prijave kao što su samoregistracija i "zapamti me". I naravno, u potpunosti se integrira s ostalim JHipster uslugama.

3. Postavljanje razvojnog okruženja

Prije bilo kakvog razvoja, prvo moramo biti sigurni da naša okolina ima postavljene sve preduvjete. Pored svih alata opisanih u našem članku Uvod u JHipster, trebat će nam pokrenuti JHipster Registry. Baš kao brzo sažimanje, usluga registra omogućuje različitim uslugama koje ćemo stvoriti da pronađu i razgovaraju jedni s drugima.

Cjelovit postupak generiranja i pokretanja registra opisan je u odjeljku 4.1 našeg JHipstera s člankom Microservice Architecture pa ga ovdje nećemo ponavljati. Docker slika je također dostupna i može se koristiti kao alternativa.

4. Generiranje nove usluge JHipster UAA

Izradimo našu uslugu UAA pomoću uslužnog programa naredbenog retka JHipster:

$ mkdir uaa $ cd uaa $ jhipster 

Prvo pitanje na koje moramo odgovoriti je koju vrstu aplikacije želimo generirati. Pomoću tipki sa strelicama odabrat ćemo opciju "JHipster UAA (za mikroservisnu OAuth2 provjeru autentičnosti)":

Dalje, od nas će se zatražiti nekoliko pitanja u vezi s određenim detaljima u vezi s generiranom uslugom, poput naziva aplikacije, porta poslužitelja i otkrivanja usluge:

Uglavnom su zadani odgovori u redu. Što se tiče osnovnog naziva aplikacije, što utječe na mnoge generirane artefakte, mi smo odabrali "Uaa" (malo slovo) - razumno ime. Ako se želimo, možemo se poigrati s ostalim vrijednostima, ali to neće promijeniti glavne značajke generiranog projekta.

Nakon odgovora na ova pitanja, JHipster će stvoriti sve datoteke projekta i instalirati npm ovisnosti paketa (koje se u ovom slučaju zapravo ne koriste).

Sada možemo koristiti lokalnu Maven skriptu za izgradnju i pokretanje naše usluge UAA:

$ ./mvnw ... izostavljene poruke izrade 2018-10-14 14: 07: 17.995 INFO 18052 --- [restartedMain] com.baeldung.jhipster.uaa.UaaApp: ------------ ---------------------------------------------- Aplikacija 'uaa' trči! Pristupni URL-ovi: Lokalni: // localhost: 9999 / Vanjski: //192.168.99.1:9999/ Profil (i): [dev, swagger] ------------------- --------------------------------------- 2018-10-14 14: 07: 18.000 INFO 18052 --- [restartedMain] com.baeldung.jhipster.uaa.UaaApp: --------------------------------- ------------------------- Poslužitelj za konfiguriranje: povezan s konfiguracijskim poslužiteljem registra JHipster! -------------------------------------------------- -------- 

Ključna poruka na koju ovdje treba obratiti pozornost je ona koja kaže da je UAA povezana s JHipster Registryom. Ova poruka ukazuje na to da se UAA uspio registrirati i bit će dostupan za otkrivanje drugim mikroservisima i pristupnicima.

5. Testiranje usluge UAA

Budući da generirana usluga UAA sama nema korisničko sučelje, moramo koristiti izravne API pozive da bismo testirali radi li prema očekivanjima.

Dvije su funkcije za koje moramo biti sigurni da rade prije nego što ih upotrijebimo s drugim dijelovima ili našim sustavom: Generiranje OAuth2 tokena i preuzimanje računa.

Prvo, krenimo uzmite novi token iz krajnje točke OAuth naše UAA, koristeći jednostavan kovrča naredba:

$ curl -X POST --data \ "korisničko ime = korisnik & lozinka = korisnik & grant_type = lozinka & opseg = openid" \ // web_app: [e-pošta zaštićena]: 9999 / oauth / token 

Evo, koristili smo dodjela lozinke protok, koristeći dva para vjerodajnica. U ovoj vrsti tijeka šaljemo vjerodajnice klijenta koristeći osnovnu HTTP provjeru autentičnosti koju kodiramo izravno u URL.

Vjerodajnice krajnjeg korisnika šalju se kao dio tijela, koristeći standardne parametre korisničkog imena i lozinke. Također koristimo korisnički račun s imenom "korisnik", koji je prema zadanim postavkama dostupan u testnom profilu.

Pod pretpostavkom da smo sve detalje naveli točno, dobit ćemo odgovor koji sadrži token za pristup i token za osvježavanje:

{"access_token": "eyJh ... (žeton izostavljen)", "token_type": "nosilac", "refresh_token": "eyJ ... (token izostavljen)", "expires_in": 299, "scope": " openid "," iat ": 1539650162," jti ":" 8066ab12-6e5e-4330-82d5-f51df16cd70f "}

Sad možemo koristite vraćeno pristupni_token da biste dobili podatke za pridruženi račun pomoću račun resurs, koji je dostupan u usluzi UAA:

$ curl -H "Ovlaštenje: Donositelj eyJh ... (pristupni žeton je izostavljen)" \ // localhost: 9999 / api / account {"id": 4, "login": "user", "firstName": "User" , "lastName": "Korisnik", "email": "[e-pošta zaštićena]", "imageUrl": "", "aktivirano": true, "langKey": "en", "createdBy": "system", " createdDate ":" 2018-10-14T17: 07: 01.336Z "," lastModifiedBy ":" system "," lastModifiedDate ": null," powers ": [" ROLE_USER "]} 

Napominjemo da ovu naredbu moramo izdati prije isteka pristupnog tokena. Prema zadanim postavkama usluga UAA izdaje tokene koji vrijede pet minuta, što je razumna vrijednost za proizvodnju.

Uređivanjem datoteke lako možemo promijeniti životni vijek važećih tokena prijava-.iml datoteka koja odgovara profilu pod kojim pokrećemo aplikaciju i postavljamo uaa.web-client-configuration.access-token-validity-in-seconds ključ. Datoteke s postavkama nalaze se u src / main / resources / config direktorij našeg projekta UAA.

6. Generiranje pristupnika s omogućenom UAA

Sad kad smo sigurni da naš UAA servis i registar usluga rade, stvorimo ekosustav za interakciju s njima. Na kraju ćemo dodati:

  • Prednji kraj temeljen na kutu
  • Mikroservisna pozadina
  • API pristupnik koji sučeljava oba

Počnimo zapravo s pristupnikom, jer će to biti usluga koja će pregovarati s UAA-om o provjeri autentičnosti. Bit će domaćin našoj prednjoj aplikaciji i usmjeravat će API zahtjeve na druge mikroservise.

Još jednom ćemo upotrijebiti alat za naredbene retke JHipster unutar novostvorenog direktorija:

$ mkdir gateway $ cd gateway $ jhipster

Kao i prije, moramo odgovoriti na nekoliko pitanja kako bismo generirali projekt. Najvažnije su sljedeće:

  • Vrsta aplikacije: mora biti "pristupnik za mikro usluge"
  • Naziv aplikacije: Ovaj ćemo put upotrijebiti "gateway"
  • Otkrivanje usluge: Odaberite “JHipster registry”
  • Vrsta ovjere:Moramo odabrati opciju "Autentifikacija s JHipster UAA poslužiteljem" ovdje
  • UI okvir: Odaberite "Kutni 6"

Jednom kada JHipster generira sve svoje artefakte, možemo izgraditi i pokrenuti pristupnik s priloženom skriptom omotača Maven:

$ ./mwnw ... izostavljene su mnoge poruke ---------------------------------------- ------------------ Program 'gateway' je pokrenut! Pristupni URL-ovi: Lokalni: // localhost: 8080 / Vanjski: //192.168.99.1:8080/ Profil (i): [dev, swagger] ------------------- --------------------------------------- 2018-10-15 23: 46: 43.011 INFO 21668 --- [restartedMain] c.baeldung.jhipster.gateway.GatewayApp: --------------------------------- ------------------------- Poslužitelj za konfiguriranje: povezan s konfiguracijskim poslužiteljem registra JHipster! -------------------------------------------------- -------- 

S gornjom porukom možemo pristupiti našoj aplikaciji usmjeravajući naš preglednik na // localhost: 8080, koja bi trebala prikazivati ​​zadanu generiranu početnu stranicu:

Idemo naprijed i prijavite se u našu aplikaciju, navigacijom na Račun> Prijava stavka izbornika. Koristit ćemo admin / admin kao vjerodajnice, koje JHipster automatski stvara prema zadanim postavkama. Sve u redu, na stranici dobrodošlice prikazat će se poruka koja potvrđuje uspješnu prijavu:

Osvrnimo se na ono što se dogodilo da nas dovede ovdje: Prvo je pristupnik poslao naše vjerodajnice na krajnju točku UAA OAuth2 tokena, koja ih je provjerila i generirala odgovor koji sadrži pristup i osvježavanje JWT tokena. Tada je gateway uzeo te tokene i vratio ih u preglednik kao kolačiće.

Dalje, kutni prednji kraj nazvan / uaa / api / account API, koji je još jednom pristupnik proslijedio na UAA. U ovom procesu pristupnik uzima kolačić koji sadrži pristupni token i koristi njegovu vrijednost za dodavanje zaglavlja autorizacije zahtjevu.

Ako je potrebno, sav taj tijek možemo vidjeti vrlo detaljno provjerom dnevnika UAA i Gatewaya. Potpune podatke na razini žice možemo dobiti i postavljanjem org.apache.http.wire nivo logera do DEBUG.

7. Generiranje mikroservisa s omogućenom UAA

Sad kad je naše aplikacijsko okruženje pokrenuto, vrijeme je da mu dodate jednostavnu mikrouslugu. Izradit ćemo mikroservis "citati" koji će otkriti potpuni REST API koji nam omogućuje stvaranje, postavljanje upita, izmjenu i brisanje skupa cijena dionica. Svaka citata imat će samo tri svojstva:

  • Trgovački simbol kotacije
  • Njegova cijena, i
  • Oznaka vremena posljednje trgovine

Vratimo se našem terminalu i upotrijebimo alat za naredbene retke JHipster za generiranje našeg projekta:

$ mkdir citira $ cd citira $ jhipster 

Ovaj put tražit ćemo od JHipstera da generira Primjena mikrousluga, koje ćemo nazvati "citati". Pitanja su slična onima na koja smo već odgovarali. Možemo zadržati zadane vrijednosti za većinu njih, osim za ove tri:

  • Otkrivanje usluge: Odaberite "JHipster Registry" jer ga već koristimo u našoj arhitekturi
  • Put do aplikacije UAA: Budući da sve direktorije projekata držimo u istoj mapi, to će biti ../uaa (osim ako ga nismo promijenili, naravno)
  • Vrsta ovjere: Odaberite “JHipster UAA server”

Evo kako će izgledati tipičan slijed odgovora u našem slučaju:

Jednom kada JHipster završi s generiranjem projekta, možemo ga izraditi:

$ mvnw ... puno, mnogo poruka izostavljeno ---------------------------------------- ------------------ Izvodi se 'citati' aplikacije! URL-ovi za pristup: Lokalni: // localhost: 8081 / Vanjski: //192.168.99.1:8081/ Profil (i): [dev, swagger] ------------------- --------------------------------------- 2018-10-19 00: 16: 05.581 INFO 16092 --- [restartedMain] com.baeldung.jhipster.quotes.QuotesApp: --------------------------------- ------------------------- Poslužitelj za konfiguriranje: povezan s konfiguracijskim poslužiteljem registra JHipster! -------------------------------------------------- -------- ... izostavljeno više poruka 

Poruka "Povezano s konfiguracijskim poslužiteljem registra JHipster!" je ono što ovdje tražimo. Njegova prisutnost govori nam da se mikroservis registrirao u registru i zbog toga će pristupnik moći usmjeravati zahtjeve na naš resurs "citati" i prikazivati ​​ga na lijepom korisničkom sučelju, nakon što ga kreiramo. Budući da koristimo arhitekturu mikro usluga, podijelili smo ovaj zadatak u dva dijela:

  • Stvorite pozadinsku uslugu resursa "citati"
  • Stvorite korisničko sučelje "citati" u prednjem dijelu (dio projekta pristupnika)

7.1. Dodavanje resursa citata

Prvo, trebamo provjerite je li zaustavljena aplikacija mikroservisa s navodnicima - možemo pritisnuti CTRL-C na istom prozoru konzole koji smo prethodno koristili za njegovo pokretanje.

Ajmo sad dodajte entitet u projekt pomoću JHipsterovog alata. Ovaj put ćemo upotrijebiti import-jdl naredba, koja će nas spasiti od zamornog i sklonom pogreškama procesa pojedinačnog davanja svih detalja. Za dodatne informacije o JDL formatu, pogledajte cjelokupnu referencu JDL.

Dalje, mi stvoriti tekstualnu datoteku pod nazivom citati.jh koji sadrže naše Citat definicija entiteta, zajedno s nekim smjernicama za generiranje koda:

entitet Citat {simbol String potreban jedinstven, potrebna je cijena BigDecimal, potrebna lastTrade ZonedDateTime} dto Citat sa mapstruct paginate Citat sa uslugom paginacije Citat sa serviceImpl mikroservisom Citat sa filterom citata Citat clientRootFolder Citat sa citatima 

Sad možemo uvezi definiciju ovog entiteta našem projektu:

$ jhipster import-jdl citati.jh 

Napomena: tijekom uvoza, JHipster će se žaliti na sukob tijekom primjene promjena na master.xml datoteka. Možemo sigurno odabrati prepisati opcija u ovom slučaju.

Sada možemo graditi i ponovno pokretati našu mikro uslugu koristeći mvnw. Nakon što se pokrene, možemo provjeriti je li pristupnik prihvatio novu rutu koja pristupa Gateway pogled dostupan iz Uprava izbornik. Ovaj put možemo vidjeti da postoji unos za "/citati/**" ruta, kojapokazuje da je pozadina spremna za upotrebu od strane korisničkog sučelja.

7.2. Dodavanje korisničkog sučelja citata

Konačno, generirajmo CRUD UI u projektu pristupnika koji ćemo koristiti za pristup našim ponudama. Koristit ćemo istu JDL datoteku iz projekta mikroservisa "quotes" za generiranje komponenata korisničkog sučelja, a uvest ćemo je pomoću JHipsterove import-jdl naredba:

$ jhipster import-jdl ../jhipster-quotes/quotes.jh ... poruke izostavljene? Prebrisati webpack \ webpack.dev.js? g ... poruke izostavljene Čestitamo, izvršenje JHipstera je završeno! 

Tijekom uvoza, JHipster će nekoliko puta zatražiti radnju koju treba poduzeti u vezi s sukobljenim datotekama. U našem slučaju možemo jednostavno prebrisati postojeće resurse jer nismo izvršili nikakvu prilagodbu.

Sada možemo ponovno pokrenuti pristupnik i vidjeti što smo postigli. Usmjerimo svoj preglednik prema gatewayu // localhost: 8080, pazeći da osvježimo njegov sadržaj. The Entiteti izbornik bi sada trebao imati novi unos za Citati resurs:

Klikom na ovu opciju izbornika otvara se Citati zaslon s popisom:

Očekivano, popis je prazan - još nismo dodali nijedan navodnik! Pokušajmo ga dodati klikom na „Stvori novi gumb za citat“ u gornjem desnom dijelu ovog zaslona, ​​što nas dovodi do obrasca za stvaranje / uređivanje:

Vidimo da generirani obrazac ima sve očekivane značajke:

  • Obavezna polja označena su crvenim indikatorom, koji jednom popunjen postaje zeleni
  • Datum / vrijeme i numerička polja koriste izvorne komponente za pomoć pri unosu podataka
  • Možemo otkazati ovu aktivnost, što će podatke ostaviti nepromijenjenima, ili spasiti naš novi ili izmijenjeni entitet

Nakon popunjavanja ovog obrasca i udarca Uštedjeti, vidjet ćemo rezultate na ekranu s popisima. Sada možemo vidjeti novo Citati primjeru podatkovnoj mreži:

Kao administrator imamo i pristup stavci izbornika API, koji nas vodi do standardnog portala za programere Swagger API. Na ovom zaslonu možemo odabrati jedan od dostupnih API-ja za vježbanje:

  • zadano: Gateway-ov vlastiti API koji prikazuje dostupne rute
  • uaa: API-ji računa i korisnika
  • citati: API za citate

8. Sljedeći koraci

Aplikacija koju smo do sada izradili funkcionira prema očekivanjima i pruža solidnu osnovu za daljnji razvoj. Svakako ćemo također trebati napisati neki (ili puno) prilagođenih kodova, ovisno o složenosti naših zahtjeva. Neka područja koja će vjerojatno trebati nešto raditi su:

  • Prilagođavanje izgleda i osjećaja korisničkog sučelja: To je obično prilično jednostavno zbog načina na koji je strukturirana prednja aplikacija - možemo puno napredovati jednostavnim petljanjem CSS-a i dodavanjem nekih slika
  • Izmjene korisničkog spremišta: Neke organizacije već imaju neku vrstu unutarnjeg korisničkog spremišta (npr. LDAP direktorij) - to će zahtijevati promjene na UAA, ali lijep dio je što ga trebamo promijeniti samo jednom
  • Finija granična autorizacija za entitete:Standardni sigurnosni model koji koristi generirani pozadinski entitet nema bilo kakvu zaštitu na razini instance i / ili na polju - na programeru je da ta ograničenja doda na odgovarajuću razinu (API ili usluga, ovisno o slučaju)

Čak i uz te primjedbe, upotreba alata poput JHispter može puno pomoći pri razvoju nove aplikacije. Donijet će sa sobom solidne temelje i može zadržati dobru razinu dosljednosti u našoj bazi koda kako se sustav - i programeri - razvijaju.

9. Zaključak

U ovom smo članku pokazali kako koristiti JHispter za stvaranje radne aplikacije koja se temelji na arhitekturi mikro usluga i UAH poslužitelju JHipstera. To smo postigli bez pisanja ijednog retka Java koda, što je prilično impresivno.

Kao i obično, puni kod za projekte predstavljene u ovom članku dostupan je u našem GitHub spremištu.


$config[zx-auto] not found$config[zx-overlay] not found