Spring Security - כותרות בקרת מטמון

1. הקדמה

במאמר זה נחקור כיצד אנו יכולים לשלוט במטמון HTTP באמצעות Spring Security.

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

2. התנהגות מטמון ברירת מחדל

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

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

ראשית, בואו נגדיר את אבטחת האביב ליישום שלנו:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity מחלקה ציבורית SpringSecurityConfig מרחיב את WebSecurityConfigurerAdapter {@Override מוגן חלל להגדיר (HttpSecurity http) זורק חריג {}}

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

לאחר מכן, בואו נשתמש בנקודת סיום פשוטה של ​​REST:

@GetMapping ("/ ברירת מחדל / משתמשים / {name}") ResponseEntity ציבורי getUserWithDefaultCaching (שם מחרוזת PathVariable) {return ResponseEntity.ok (UserDto חדש (שם)); }

כתוצאה מכך בקרת מטמון הכותרת תיראה כך:

[cache-control: no-cache, no-store, max-age = 0, חובה לאמת]

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

נתון (). כאשר () .get (getBaseUrl () + "/ ברירת מחדל / משתמשים / מיכאל"). ואז () .header ("Cache-Control", "no-cache, no-store, max-age = 0 , חייב לאמת מחדש "). כותרת (" פראגמה "," ללא מטמון ");

בעיקרו של דבר, המשמעות של זה היא שדפדפן לעולם לא ישמור את התגובה הזו במטמון.

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

3. עקיפת התנהגות המטמון המוגדרת כברירת מחדל

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

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

@GetMapping ("/ משתמשים / {name}") ResponseEntity getUser (@PathVariable שם מחרוזת) {return ResponseEntity.ok () .cacheControl (CacheControl.maxAge (60, TimeUnit.SECONDS)). גוף (UserDto חדש (שם) ); }

בואו נגיע לנקודת הקצה הזו במבחן שלנו ונקבע ששינינו את הכותרות:

נתון (). כאשר () .get (getBaseUrl () + "/ משתמשים / מיכאל"). ואז (). כותרת ("Cache-Control", "max-age = 60");

כפי שאנו רואים, ביטלנו את ברירות המחדל, וכעת התגובה שלנו תישמר במטמון בדפדפן למשך 60 שניות.

4. כיבוי התנהגות המטמון לשמירת המחדל

אנו יכולים גם לכבות את כותרות ברירת המחדל לבקרת מטמון של Spring Security. זה דבר מסוכן למדי, ולא ממש מומלץ. אבל אם אנחנו באמת רוצים, נוכל לנסות את זה על ידי עקיפת ה- להגדיר שיטת ה- מתאם WebSecurityConfigurer:

התצורה הריקה מוגנת של @Override (HttpSecurity http) זורקת חריג {http.headers (). השבת (); }

עכשיו, בוא נגיש בקשה לנקודת הסיום שלנו ונראה איזו תגובה אנו מקבלים:

נתון (). כאשר () .get (getBaseUrl () + "/ ברירת מחדל / משתמשים / מיכאל"). ואז (). כותרות (HashMap חדש ());

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

5. מסקנה

מאמר זה מדגים כיצד Spring Security מבטלת מטמון HTTP כברירת מחדל ומסביר כי זה מכיוון שאיננו רוצים לשמור מטמון משאבים מאובטחים. ראינו גם כיצד אנו יכולים להשבית או לשנות התנהגות זו כראות עינינו.

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