בניית מיקרו-שירות בסיסי מאובטח על ידי UAA

1. סקירה כללית

במאמרים קודמים סקרנו את היסודות של JHipster וכיצד להשתמש בו ליצירת יישום מבוסס מיקרו-שירותים.

במדריך זה, נחקור את חשבון המשתמשים וההסמכות של JHipster - בקיצור UAA - וכיצד להשתמש בו לאבטחת יישום מיקרו-שירות מבוסס JHispter מלא. אפילו יותר טוב, את כל זה ניתן להשיג בלי לכתוב שורת קוד אחת!

2. תכונות הליבה של UAA

מאפיין חשוב ביישומים שבנינו במאמרים הקודמים שלנו הוא שחשבונות משתמשים היו חלק בלתי נפרד מהם. עכשיו, זה בסדר כשיש לנו יישום יחיד, אבל מה אם נרצה לשתף חשבונות משתמשים בין מספר יישומים שנוצרו על ידי JHipster? כאן נכנס UAA של JHipster.

UAA של JHipster הוא מיקרו-שירות שכן נבנה, נפרס ומתנהל ללא תלות בשירותים אחרים ביישום שלנו. הוא משמש כ:

  • שרת אישור OAuth2, המבוסס על יישום Spring Boot
  • שרת ניהול זהויות, החושף CRUD API של חשבון משתמש

JHipster UAA תומך גם בתכונות התחברות טיפוסיות כמו רישום עצמי ו"זכור אותי ". וכמובן, זה משתלב לחלוטין עם שירותים אחרים של JHipster.

3. הגדרת סביבת פיתוח

לפני שמתחילים בפיתוח כלשהו, ​​עלינו להיות בטוחים שהסביבה שלנו מציבה את כל תנאי הקדם שלה. מלבד כל הכלים המתוארים במאמר Intro To JHipster שלנו, נצטרך רישום JHipster פועל. בדיוק כסיכום מהיר, שירות הרישום מאפשר לשירותים השונים שניצור למצוא ולדבר ביניהם.

ההליך המלא להפקת הרישום ולהפעלתו מתואר בסעיף 4.1 ל- JHipster שלנו עם מאמר אדריכלות Microservice כך שלא נחזור עליו כאן. תמונת Docker זמינה גם והיא יכולה לשמש כחלופה.

4. יצירת שירות JHipster UAA חדש

בואו ליצור את שירות UAA שלנו באמצעות כלי שורת הפקודה JHipster:

$ mkdir uaa $ cd uaa $ jhipster 

השאלה הראשונה שעלינו לענות עליה היא איזה סוג יישום אנו רוצים ליצור. באמצעות מקשי החצים נבחר באפשרות "JHipster UAA (לאימות מיקרו-שירות OAuth2)":

לאחר מכן, נתבקש למספר שאלות הנוגעות לפרטים ספציפיים הנוגעים לשירות שנוצר, כגון שם היישום, יציאת השרת וגילוי השירות:

לרוב, תשובות ברירת המחדל הן בסדר. באשר לשם הבסיס של היישום, אשר משפיע על רבים מהחפצים שנוצרובחרנו "Uaa" (אותיות קטנות) - שם הגיוני. אנחנו יכולים לשחק עם הערכים האחרים אם אנחנו רוצים, אבל זה לא ישנה את התכונות העיקריות של הפרויקט שנוצר.

לאחר תשובה לשאלות אלה, JHipster תיצור את כל קבצי הפרויקט ותתקין npm תלות בחבילה (שבמקרה זה לא משתמשים בה באמת).

כעת אנו יכולים להשתמש בתסריט Maven המקומי כדי לבנות ולהפעיל את שירות UAA שלנו:

$ ./mvnw ... בנה הודעות שהושמטו 14-10-2018 14: 07: 17.995 INFO 18052 --- [restartedMain] com.baeldung.jhipster.uaa.UaaApp: ------------ ---------------------------------------------- יישום 'uaa' רץ! כתובות אתרים לגישה: מקומי: // localhost: 9999 / חיצוני: //192.168.99.1:9999/ פרופילים: [dev, swagger] ------------------- --------------------------------------- 2018-10-14 14: 07: 18.000 מידע 18052 --- [restartedMain] com.baeldung.jhipster.uaa.UaaApp: --------------------------------- ------------------------- שרת Config: מחובר לשרת התצורה של JHipster Registry! -------------------------------------------------- -------- 

המסר המרכזי שיש לשים לב אליו כאן הוא המסמך כי UAA מחובר לרישום JHipster. הודעה זו מציינת כי UAA הצליחה לרשום את עצמה ותהיה זמינה לגילוי על ידי מיקרו-שירותים ושערים אחרים.

5. בדיקת שירות UAA

מכיוון שלשירות UAA שנוצר אין ממשק משתמש בפני עצמו, עלינו להשתמש בשיחות API ישירות כדי לבדוק אם הוא פועל כצפוי.

ישנן שתי פונקציות שעלינו לוודא שהן עובדות לפני שנשתמש בה עם חלקים אחרים או המערכת שלנו: יצירת אסימון OAuth2 ואחזור חשבונות.

ראשית, בואו קבל אסימון חדש מנקודת הקצה OAuth של UAA שלנו, באמצעות פשוט סִלְסוּל פקודה:

$ curl -X POST - נתונים \ "username = user & password = user & grant_type = password & scope = openid" \ // web_app: [מוגן בדוא"ל]: 9999 / oauth / token 

הנה, השתמשנו ב- הענקת סיסמא זרימה, תוך שימוש בשני זוגות אישורים. בסוג זה של זרימה, אנו שולחים אישורי לקוח באמצעות אימות HTTP בסיסי, אותו אנו מקודדים ישירות בכתובת האתר.

אישורי משתמש הקצה נשלחים כחלק מהגוף, באמצעות הפרמטרים הסטנדרטיים של שם המשתמש והסיסמה. אנו משתמשים גם בחשבון המשתמש בשם "מִשׁתַמֵשׁ", אשר זמין כברירת מחדל בפרופיל הבדיקה.

בהנחה שסיפקנו את כל הפרטים בצורה נכונה, נקבל תשובה המכילה אסימון גישה ואסימון רענון:

{"access_token": "eyJh ... (אסימון הושמט)", "token_type": "נושא", "refresh_token": "eyJ ... (אסימון הושמט)", "expires_in": 299, "scope": " openid "," iat ": 1539650162," jti ":" 8066ab12-6e5e-4330-82d5-f51df16cd70f "}

אנחנו יכולים עכשיו השתמש בחזרה אסימון גישה לקבלת מידע עבור החשבון המשויך באמצעות חֶשְׁבּוֹן מַשׁאָב, הזמין בשירות UAA:

$ curl -H "אישור: נושא eyJh ... (אסימון גישה הושמט)" \ // localhost: 9999 / api / account {"id": 4, "login": "user", "firstName": "User" , "lastName": "משתמש", "email": "[דוא"ל מוגן]", "imageUrl": "", "enabled": true, "langKey": "en", "createdBy": "system", " createdDate ":" 2018-10-14T17: 07: 01.336Z "," lastModifiedBy ":" system "," lastModifiedDate ": null," powers ": [" ROLE_USER "]} 

שים לב שעלינו להוציא פקודה זו לפני שתוקף אסימון הגישה יפוג. כברירת מחדל, שירות UAA מנפיק אסימונים בתוקף למשך חמש דקות, וזה ערך הגיוני לייצור.

אנו יכולים לשנות את אורך החיים של אסימונים תקפים בקלות על ידי עריכת ה- יישום .yml קובץ המתאים לפרופיל שאליו אנו מריצים את האפליקציה והגדרת ה- uaa.web-client-configuration.access-token-validity-in-seconds מַפְתֵחַ. קבצי ההגדרות נמצאים ב src / main / resources / config ספריה של פרויקט UAA שלנו.

6. יצירת השער המאפשר UAA

עכשיו, כשאנחנו בטוחים ששירות ה- UAA ושירות הרישום שלנו פועלים, בואו ניצור מערכת אקולוגית שתוכלו לקיים איתם אינטראקציה. בסוף, נוסיף:

  • חזית מבוססת זוויתית
  • אחורי מיקרו-שירות
  • שער API שמצפה את שני אלה

בואו נתחיל בפועל עם השער, מכיוון שזה יהיה השירות שינהל משא ומתן עם UAA לצורך אימות. הוא יארח את היישום החזיתי שלנו ונתב בקשות API למיקרו-שירותים אחרים.

שוב נשתמש בכלי שורת הפקודה JHipster בספרייה שנוצרה לאחרונה:

$ mkdir gateway $ cd gateway $ jhipster

כמו בעבר, עלינו לענות על כמה שאלות על מנת לייצר את הפרויקט. החשובים הם:

  • סוג יישום: חייב להיות "שער המיקרו-שירותים"
  • שם אפליקציה: נשתמש ב"שער "הפעם
  • גילוי שירות: בחר "רישום JHipster"
  • סוג האימות:עלינו לבחור באפשרות "אימות באמצעות שרת UHA של JHipster" פה
  • מסגרת ממשק המשתמש: בואו לבחור "זוויתית 6"

ברגע ש- JHipster מייצר את כל החפצים שלה, אנו יכולים לבנות ולהפעיל את השער עם סקריפט העטיפה Maven המסופק:

$ ./mwnw ... הודעות רבות הושמטו ---------------------------------------- ------------------ יישום 'שער' פועל! כתובות אתרים לגישה: מקומי: // localhost: 8080 / חיצוני: //192.168.99.1:8080/ פרופילים: [dev, swagger] ------------------- --------------------------------------- 2018-10-15 23: 46: 43.011 מידע 21668 --- [restartedMain] c.baeldung.jhipster.gateway.GatewayApp: --------------------------------- ------------------------- שרת Config: מחובר לשרת התצורה של JHipster Registry! -------------------------------------------------- -------- 

באמצעות ההודעה הנ"ל, אנו יכולים לגשת ליישום שלנו על ידי הפניית הדפדפן אליו // localhost: 8080, אשר אמור להציג את דף הבית המוגדר כברירת מחדל:

בואו ונתחיל להיכנס ליישום שלנו, על ידי ניווט אל חשבון> התחברות פריט בתפריט. נשתמש מנהל / מנהל כתעודות, ש- JHipster יוצר אוטומטית כברירת מחדל. הכל בסדר, דף הפתיחה יציג הודעה המאשרת כניסה מוצלחת:

בואו נסכם מה קרה שהביא אותנו לכאן: ראשית, השער שלח את האישורים שלנו לנקודת הקצה של אסימון OAuth2 של UAA, אשר אימת אותם ויצר תגובה המכילה גישה ואסימון JWT מרענן. השער לקח אז את האסימונים והחזיר אותם לדפדפן כעוגיות.

לאחר מכן, החזית הזוויתית נקראה / uaa / api / account ממשק API, ששוב הועבר השער ל- UAA. בתהליך זה השער לוקח את קובץ ה- cookie שמכיל את אסימון הגישה ומשתמש בערכו כדי להוסיף כותרת הרשאה לבקשה.

במידת הצורך נוכל לראות את כל הזרימה הזו בפירוט רב על ידי בדיקת יומני UAA וגם יומני Gateway. אנו יכולים גם לקבל נתונים מלאים ברמת החוט על ידי הגדרת ה- org.apache.http.wire רמת לוגר ל- DEBUG.

7. יצירת מיקרו-שירות מאופשר UAA

עכשיו, כשסביבת היישומים שלנו פועלת, הגיע הזמן להוסיף לה מיקרו-שירות פשוט. ניצור מיקרו-שירות "הצעות מחיר", שיחשוף ממשק API מלא של REST המאפשר לנו ליצור, לבצע שאילתות, לשנות ולמחוק קבוצה של הצעות מחיר. לכל הצעת מחיר יהיו שלושה מאפיינים בלבד:

  • סמל המסחר של הצעת המחיר
  • מחירו, ו
  • חותמת הזמן של הסחר האחרון

בוא נחזור למסוף שלנו ונשתמש בכלי שורת הפקודה של JHipster כדי ליצור את הפרויקט שלנו:

$ mkdir ציטוטים $ cd ציטוטים $ jhipster 

הפעם, נבקש מ- JHipster ליצור יישום Microservice, שנקרא "הצעות מחיר". השאלות דומות לשאלות עליהן ענינו בעבר. אנו יכולים לשמור על ברירות המחדל עבור רובן, למעט שלוש אלה:

  • גילוי שירות: בחר באפשרות "JHipster Registry" מכיוון שאנו כבר משתמשים בה בארכיטקטורה שלנו
  • נתיב ליישום UAA: מכיוון שאנחנו שומרים את כל ספריות הפרויקטים באותה תיקייה, זה יהיה ../uaa (אלא אם כן שינינו את זה, כמובן)
  • סוג האימות: בחר "שרת JHipster UAA"

הנה איך ייראה רצף של תשובות במקרה שלנו:

לאחר ש- JHipster יסיים לייצר את הפרויקט, נוכל להמשיך ולבנות אותו:

$ mvnw ... הודעות רבות רבות הושמטו ---------------------------------------- ------------------ היישום 'הצעות מחיר' פועל! כתובות אתרים לגישה: מקומי: // localhost: 8081 / חיצוני: //192.168.99.1:8081/ פרופילים: [dev, swagger] ------------------- --------------------------------------- 2018-10-19 00: 16: 05.581 מידע 16092 --- [restartedMain] com.baeldung.jhipster.quotes.QuotesApp: --------------------------------- ------------------------- שרת Config: מחובר לשרת התצורה של JHipster Registry! -------------------------------------------------- -------- ... הודעות נוספות הושמטו 

ההודעה "מחובר לשרת התצורה של JHipster Registry!" זה מה שאנחנו מחפשים כאן. נוכחותו מספרת כי שירות המיקרו רשם את עצמו ברישום, ובשל כך השער יוכל לנתב בקשות למשאב "הצעות המחיר" שלנו ולהציגו בממשק משתמש נחמד לאחר שיצרנו אותו. מכיוון שאנחנו משתמשים בארכיטקטורת מיקרו-שירותים, אנו מחלקים משימה זו לשני חלקים:

  • צור את שירות העורף של המשאב "הצעות מחיר"
  • צור את ממשק המשתמש "הצעות מחיר" בחזית (חלק מפרויקט השער)

7.1. הוספת משאב הצעות המחיר

ראשית, אנחנו צריכים ודא כי יישום הצעת המחיר המיקרו-שירות הופסק - אנו יכולים להכות את CTRL-C באותו חלון קונסולה בו השתמשנו בעבר להפעלתו.

עכשיו, בואו להוסיף ישות לפרויקט באמצעות הכלי של JHipster. הפעם נשתמש ב- ייבוא-jdl פקודה, שתחסוך אותנו מהתהליך המייגע והמועד לטעויות של אספקת כל הפרטים בנפרד. לקבלת מידע נוסף אודות פורמט JDL, עיין בהתייחסות המלאה ל- JDL.

הבא, אנחנו ליצור קובץ טקסט בשם quotes.jh המכיל שלנו ציטוט הגדרת ישות, יחד עם כמה הוראות להפקת קוד:

ישות הצעת מחיר {סמל מחרוזת נדרשת ייחודית, מחיר BigDecimal נדרש, lastTrade ZonedDateTime נדרש} dto הצעת מחיר עם mapstruct paginate הצעת מחיר עם שירות עימוד הצעת מחיר עם serviceImpl microservice ציטוט עם הצעות מחיר מסנן הצעת מחיר clientRootFolder הצעת מחיר עם הצעות מחיר 

אנחנו יכולים עכשיו ייבא הגדרת ישות זו לפרויקט שלנו:

$ jhipster import-jdl quotes.jh 

הערה: במהלך הייבוא, JHipster תתלונן על סכסוך בעת החלת שינויים ב- master.xml קוֹבֶץ. אנחנו יכולים לבחור בבטחה את להחליף אפשרות במקרה זה.

כעת נוכל לבנות ולהפעיל את שירות המיקרו שלנו שוב באמצעות mvnw. ברגע שזה נגמר, אנחנו יכולים לוודא שהשער קולט את המסלול החדש שניגש אליו כְּנִיסָה תצוגה, זמין באתר מִנהָל תַפרִיט. הפעם אנו יכולים לראות שיש ערך עבור ה- "/ציטוטים/**" מסלול, אשרמראה כי ה- backend מוכן לשימוש על ידי ממשק המשתמש.

7.2. הוספת ממשק המשתמש לציטוטים

לבסוף, בואו ניצור את ממשק המשתמש CRUD בפרויקט השער שבו נשתמש כדי לגשת להצעות המחיר שלנו. נשתמש באותו קובץ JDL מפרויקט המיקרו-שירות "ציטוטים" כדי ליצור את רכיבי ממשק המשתמש, ונייבא אותו באמצעות ה- JHipster ייבוא-jdl פקודה:

$ jhipster import-jdl ../jhipster-quotes/quotes.jh ... הודעות הושמטו? להחליף את webpack \ webpack.dev.js? y ... הודעות הושמטו מזל טוב, ביצוע JHipster הושלם! 

במהלך הייבוא, JHipster יבקש כמה פעמים מהפעולה שהיא צריכה לנקוט בנוגע לקבצים סותרים. במקרה שלנו, אנו יכולים פשוט להחליף את המשאבים הקיימים, מכיוון שלא ביצענו התאמה אישית כלשהי.

כעת נוכל להפעיל מחדש את השער ולראות מה השגנו. בואו להפנות את הדפדפן לשער בכתובת // localhost: 8080, לוודא שנרענן את תוכנו. ה ישויות כעת בתפריט צריך להיות ערך חדש עבור ה- ציטוטים מַשׁאָב:

לחיצה על אפשרות תפריט זו מעלה את ציטוטים מסך רישום:

כצפוי, הרישום ריק - עדיין לא הוספנו הצעות מחיר! בואו ננסה להוסיף אחד על ידי לחיצה על "צור כפתור הצעת מחיר חדשה" בפינה השמאלית העליונה של המסך הזה, שמביא אותנו לטופס היצירה / עריכה:

אנו יכולים לראות כי לטופס שנוצר יש את כל התכונות הצפויות:

  • שדות חובה מסומנים בחיווי אדום, שהופך לירוק לאחר מילויו
  • שדות תאריך / שעה ושדות מספריים משתמשים ברכיבים מקוריים בכדי לעזור להזנת נתונים
  • אנו יכולים לבטל פעילות זו, שתשאיר נתונים ללא שינוי, או לשמור את היישות החדשה או שהשתנה

לאחר מילוי הטופס הזה והכות להציל, נראה את התוצאות על גבי מסך הרישום. כעת אנו יכולים לראות את החדש ציטוטים למשלברשת הנתונים:

כמנהל, יש לנו גם גישה לפריט התפריט API, שלוקח אותנו לפורטל המפתחים של Swagger API הסטנדרטי. במסך זה נוכל לבחור אחד ממשקי ה- API הזמינים לשימוש:

  • בְּרִירַת מֶחדָל: ממשק ה- API של Gateway עצמו המציג מסלולים זמינים
  • uaa: ממשקי API של חשבון ומשתמשים
  • ציטוטים: API לציטוטים

8. השלבים הבאים

היישום שבנינו עד כה עובד כמצופה ומספק בסיס איתן להמשך פיתוח. בהחלט נצטרך לכתוב קוד מותאם אישית (או הרבה) בהתאמה למורכבות הדרישות שלנו. כמה תחומים שצפויים להזדקק לעבודה הם:

  • התאמה אישית של מראה וממשק משתמש: זה בדרך כלל די קל בגלל האופן שבו היישום הקדמי בנוי - אנחנו יכולים ללכת דרך ארוכה פשוט על ידי התעסקות עם CSS והוספת כמה תמונות
  • שינויים במאגר המשתמשים: לארגונים מסוימים כבר יש מאגר כלשהו של משתמשים פנימיים (למשל ספריית LDAP) - זה ידרוש שינויים ב- UAA, אך החלק היפה הוא שאנחנו צריכים לשנות אותו רק פעם אחת
  • אישור עדין יותר על ישויות:למודל האבטחה הסטנדרטי המשמש את הקצה האחורי של הישות שנוצר אין שום סוג של אבטחה ברמת מופע ו / או ברמת השדה - על המפתח להוסיף הגבלות אלה ברמה המתאימה (API או שירות, תלוי במקרה)

גם עם ההערות האלה, שימוש בכלי כמו JHispter יכול לעזור מאוד בפיתוח אפליקציה חדשה. זה יביא איתו בסיס יציב ויכול לשמור על רמת עקביות טובה בבסיס הקוד שלנו ככל שהמערכת - והמפתחים - מתפתחים.

9. מסקנה

במאמר זה הראינו כיצד להשתמש ב- JHispter ליצירת יישום עובד המבוסס על ארכיטקטורת מיקרו-שירותים ועל שרת ה- UAA של JHipster. השגנו זאת מבלי לכתוב שורה אחת של קוד Java, וזה די מרשים.

כרגיל, הקוד המלא לפרויקטים המוצגים במאמר זה זמין במאגר GitHub שלנו.


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