אימות בסיסי באמצעות RestTemplate

תוכן עניינים

  • 1. סקירה כללית
  • 2. הגדרת ה- RestTemplate באביב
  • 3. ניהול ידני של כותרת ה- HTTP של ה- Authorization
  • 4. ניהול אוטומטי של כותרת ה- HTTP של ה- Authorization
  • 5. תלות במייב
  • 6. סיכום

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

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

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

אישור: QWxhZGRpbjpvcGVuIHNlc2FtZQ בסיסי ==

2. הגדרת ה- RestTemplate

אתחול ה- Bootstrapping RestTemplate בהקשר האביב ניתן לעשות על ידי פשוט להכריז על שעועית בשבילה; עם זאת, הגדרת ה- RestTemplate עם אימות בסיסי ידרוש התערבות ידנית, אז במקום להכריז ישירות על השעועית, מעיין FactoryBean ישמש לגמישות רבה יותר. מפעל זה ייצור ויגדיר את התבנית בעת אתחול:

@Component class class RestTemplateFactory מיישם את FactoryBean, InitializingBean {private RestTemplate restTemplate; RestTemplate ציבורי getObject () {להחזיר restTemplate; } getObjectType (Class) ציבורי (return {RestTemplate.class; } בוליאני ציבורי isSingleton () {return true; } חלל ציבורי afterPropertiesSet () {HttpHost host = new HttpHost ("localhost", 8082, "http"); restTemplate = RestTemplate חדש (HttpComponentsClientHttpRequestFactoryBasicAuth חדש (מארח)); }}

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

3. ניהול ידני של כותרת HTTP ההרשאה

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

HttpHeaders createHeaders (שם משתמש מחרוזת, סיסמת מחרוזת) {החזר HttpHeaders חדש () {{מחרוזת auth = שם משתמש + ":" + סיסמה; בתים [] encodedAuth = Base64.encodeBase64 (auth.getBytes (Charset.forName ("US-ASCII"))); מחרוזת authHeader = "בסיסי" + מחרוזת חדשה (encodedAuth); set ("Authorization", authHeader); }}; }

ואז שליחת בקשה הופכת לפשוטה באותה מידה:

restTemplate.exchange (uri, HttpMethod.POST, HttpEntity חדש (createHeaders (שם משתמש, סיסמה)), clazz);

4. ניהול אוטומטי של כותרת ה- HTTP הרשאה

גם באביב 3.0 וגם ב- 3.1 וכעת ב- 4.x יש תמיכה טובה מאוד בספריות ה- HTTP של אפאצ'י:

  • אביב 3.0, ה CommonsClientHttpRequestFactory משולב עם עכשיו קץ חייםHttpClient 3.x
  • אביב 3.1 הציג תמיכה בזרם HttpClient 4.x באמצעות HttpComponentsClientHttpRequestFactory (תמיכה שנוספה ב- JIRA SPR-6180)
  • אביב 4.0 הציג תמיכה באסינכרון דרך ה- HttpComponentsAsyncClientHttpRequestFactory

נתחיל להגדיר את הדברים עם HttpClient 4 ו- Spring 4.

ה RestTemplate ידרוש מפעל בקשות HTTP - מפעל התומך באימות בסיסי - עד כה כל כך טוב. עם זאת, באמצעות הקיים HttpComponentsClientHttpRequestFactory ישירות תתגלה כקשה, כמו האדריכלות של RestTemplate תוכנן ללא תמיכה טובה עבור HttpContext - פיסת פאזל אינסטרומנטלית. וכך נצטרך לסווג משנה HttpComponentsClientHttpRequestFactory ולדרוס את createHttpContext שיטה:

מחלקה ציבורית HttpComponentsClientHttpRequestFactoryBasicAuth מרחיב HttpComponentsClientHttpRequestFactory {מארח HttpHost; ציבור HttpComponentsClientHttpRequestFactoryBasicAuth (מארח HttpHost) {super (); this.host = מארח; } מוגן HttpContext createHttpContext (HttpMethod httpMethod, URI uri) {return createHttpContext (); } פרטי HttpContext createHttpContext () {AuthCache authCache = new BasicAuthCache (); BasicScheme basicAuth = חדש BasicScheme (); authCache.put (host, basicAuth); BasicHttpContext localcontext = חדש BasicHttpContext (); localcontext.setAttribute (HttpClientContext.AUTH_CACHE, authCache); החזר הקשר מקומי; }}

זה כאן - ביצירת ה HttpContext - שתמיכת האימות הבסיסית מובנית. כפי שאתה יכול לראות, ביצוע אימות בסיסי מונע עם HttpClient 4.x הוא קצת נטל: פרטי האימות נשמרים במטמון ותהליך הגדרת מטמון האימות הזה הוא מאוד ידני ולא אינטואיטיבי. .

ועם זה הכל במקום - RestTemplate כעת תוכל לתמוך בתכנית האימות הבסיסי רק על ידי הוספת BasicAuthorizationInterceptor;

restTemplate.getInterceptors (). הוסף (BasicAuthorizationInterceptor חדש ("שם משתמש", "סיסמה"));

והבקשה:

restTemplate.exchange ("// localhost: 8082 / spring-security-rest-basic-auth / api / foos / 1", HttpMethod.GET, null, Foo.class);

לדיון מעמיק כיצד לאבטח את שירות REST עצמו, עיין במאמר זה.

5. תלות Maven

התלות הבאות של Maven נדרשות עבור RestTemplate עצמה ועבור ספריית HttpClient:

 org.springframework spring-webmvc 5.0.6.RELEASE org.apache.httpcomponents httpclient 4.5.3 

אופציונלי, אם ה- HTTP הרשאה הכותרת נבנית באופן ידני ואז נדרשת ספרייה נוספת לתמיכה בקידוד:

 commons-codec commons-codec 1.10 

תוכלו למצוא את הגרסאות החדשות במאגר Maven.

6. מסקנה

למרות שענף הפיתוח 3.x עבור אפאצ'י HttpClient הגיע לסוף החיים זה זמן מה, ותמיכת האביב בגירסה זו הושללה לחלוטין, הרבה מהמידע שניתן למצוא ב RestTemplate וביטחון עדיין לא מתחשב HttpClient 4.x הנוכחי משחרר. מאמר זה הוא ניסיון לשנות זאת באמצעות דיון מפורט, שלב אחר שלב, כיצד להגדיר אימות בסיסי באמצעות ה- RestTemplate וכיצד להשתמש בו לצריכת REST API מאובטח.

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

זהו פרויקט מבוסס Maven, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.


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