תצורת אוטומטי של Boot Boot Security

1. הקדמה

במאמר זה נבחן את הגישה הדעתנית של Spring Boot לביטחון.

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

2. הגדרת ברירת מחדל של אבטחה

על מנת להוסיף אבטחה ליישום Spring Boot שלנו, עלינו להוסיף את ה- תלות במתחילים ביטחוניים:

 org.springframework.boot spring-boot-starter-security 

זה יכלול את SecurityAutoConfiguration class - המכיל את תצורת האבטחה הראשונית / ברירת המחדל.

שימו לב איך לא פירטנו את הגרסה כאן, מתוך הנחה שהפרויקט כבר משתמש ב- Boot כהורה.

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

ישנם כמה מאפיינים שהוגדרו מראש, כגון:

spring.security.user.name spring.security.user.password

אם אנו לא מגדירים את הסיסמה באמצעות המאפיין המוגדר מראש spring.security.user.password ולהתחיל את היישום, נבחין כי סיסמת ברירת מחדל נוצרת באופן אקראי ומודפסת ביומן המסוף:

שימוש בסיסמת אבטחה המוגדרת כברירת מחדל: c8be15de-4488-4490-9dc6-fab3f91435c6

לברירות מחדל נוספות, עיין בסעיף מאפייני אבטחה בעמוד ההתייחסות למאפייני יישום משותף של Spring Boot.

3. השבתת התצורה האוטומטית

כדי למחוק את התצורה האוטומטית של האבטחה ולהוסיף את התצורה שלנו, עלינו לא לכלול את ה- SecurityAutoConfiguration מעמד.

ניתן לעשות זאת באמצעות אי הכללה פשוטה:

@SpringBootApplication (exclude = {SecurityAutoConfiguration.class}) class public SpringBootSecurityApplication {public static void main (String [] args) {SpringApplication.run (SpringBootSecurityApplication.class, args); }} 

או על ידי הוספת תצורה כלשהי אל ה- application.properties קוֹבֶץ:

spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration

ישנם גם מקרים מסוימים שבהם התקנה זו אינה מספיקה לגמרי.

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

על מנת לפתור בעיה זו, עלינו להוציא מעמד זה; ובאופן ספציפי למצב המפעיל, עלינו לא לכלול ManagementWebSecurityAutoConfiguration.

3.1. השבתה לעומת התצורה האוטומטית של אבטחה

יש הבדל משמעותי בין השבתה של תצורה אוטומטית לבין חריגה ממנה.

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

  1. שילוב אבטחת יישומים עם ספק אבטחה מותאם אישית
  2. העברת יישום Spring מדור קודם עם הגדרת האבטחה הקיימת - אל Spring Boot

אך לרוב לא נצטרך להשבית באופן מלא את תצורת האבטחה האוטומטית.

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

4. קביעת תצורה של אבטחת אתחול האביב

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

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

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

spring.security.user.password = סיסמה

אם אנו רוצים תצורה גמישה יותר, עם מספר משתמשים ותפקידים למשל - עלינו לעשות שימוש במלואו @תְצוּרָה מעמד:

@Configuration @EnableWebSecurity המחלקה הציבורית BasicConfiguration מרחיב את WebSecurityConfigurerAdapter {@Override מוגן חלל מוגדר (AuthenticationManagerBuilder auth) זורק חריג {PasswordEncoder מקודד = PasswordEncoderFactories.createDelegatingPasswordEncoder (); auth .inMemoryAuthentication () .withUser ("user") .password (encoder.encode ("password")) .roles ("USER"). and () .withUser ("admin") .password (encoder.encode (" admin ")) .roles (" USER "," ADMIN "); } תצורת הריק המוגנת על ידי @Override (HttpSecurity http) זורקת חריג {http .authorizeRequests () .anyRequest () .authenticated () .and () .httpBasic (); }}

ה @EnableWebSecurity הערה היא קריטית אם אנו משביתים את תצורת האבטחה המוגדרת כברירת מחדל.

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

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

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

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = RANDOM_PORT) בכיתה ציבורית BasicConfigurationIntegrationTest {TestRestTemplate restTemplate; בסיס URL; יציאת int @LocalServerPort; @ לפני setUp הריק הציבורי () זורק MalformedURLException {restTemplate = TestRestTemplate חדש ("משתמש", "סיסמה"); base = URL חדש ("// localhost:" + port); } @Test ציבורי בטל כאשרLoggedUserRequestsHomePage_ThenSuccess () זורק IllegalStateException, IOException {ResponseEntity response = restTemplate.getForEntity (base.toString (), String.class); assertEquals (HttpStatus.OK, response.getStatusCode ()); assertTrue (response.getBody (). מכיל ("Baeldung")); } @Test ציבורי בטל כאשר UserWithWrongCredentials_thenUnauthorizedPage () זורק חריג {restTemplate = testRestTemplate חדש ("משתמש", "שגוי סיסמה"); ResponseEntity response = restTemplate.getForEntity (base.toString (), String.class); assertEquals (HttpStatus.UNAUTHORIZED, response.getStatusCode ()); assertTrue (response.getBody (). מכיל ("לא מורשה")); }}

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

5. אתחול האביב OAuth2 תצורה אוטומטית (באמצעות מחסנית מדור קודם)

ל- Spring Boot יש תמיכה ייעודית לתצורה אוטומטית עבור OAuth2.

תמיכת Spring Security OAuth שהגיעה עם Spring Boot 1.x הוסרה בגרסאות אתחול מאוחרות יותר במקום תמיכת OAuth מהשורה הראשונה שמגיעה יחד עם Spring Security 5. נראה כיצד להשתמש בזה בפרק הבא.

עבור ערימת המורשת (באמצעות Spring Security OAuth), ראשית נצטרך להוסיף תלות של Maven כדי להתחיל בהגדרת היישום שלנו:

 org.springframework.security.oauth אביב-ביטחון-oauth2 

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

כעת, יש לנו אפשרויות רבות להמשיך, תלוי בהיקף היישום שלנו.

5.1. תצורה אוטומטית של שרת ההרשאה OAuth2

אם אנו רוצים שהיישום שלנו יהיה ספק OAuth2, נוכל להשתמש בו @EnableAuthorizationServer.

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

שימוש בסיסמת אבטחה המוגדרת כברירת מחדל: a81cb256-f243-40c0-a585-81ce1b952a98 security.oauth2.client.client-id = 39d2835b-1f87-4a77-9798-e2975f36972e security.oauth2.client.client-secret = f1463f8b-0791-46fe-9 -521b86c55b71

אישורים אלה יכולים לשמש כדי להשיג אסימון גישה:

סלסול -X POST -u 39d2835b-1f87-4a77-9798-e2975f36972e: f1463f8b-0791-46fe-9269-521b86c55b71 \ -d grant_type = client_credentials -d username = user -d password = a81cb256-f243-40a01 -d scope = כתוב // localhost: 8080 / oauth / token

מאמר נוסף שלנו מספק פרטים נוספים בנושא.

5.2. הגדרות תצורה אוטומטית אחרות של אתחול האביב של OAuth2

ישנם מקרי שימוש אחרים המכוסים על ידי Spring Boot OAuth2 כמו:

  1. שרת משאבים - @EnableResourceServer
  2. יישום לקוח - @ EnableOAuth2Sso אוֹ @ EnableOAuth2Client

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

ניתן למצוא את כל המאפיינים הספציפיים ל- OAuth2 במאפייני היישום הנפוצים של Spring Boot.

6. Spring Boot OAuth2 תצורה אוטומטית (באמצעות מחסנית חדשה)

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

בואו נסתכל עליהם אחד אחד.

6.1. תמיכה בשרת הרשאות OAuth2

כפי שראינו בפרק הקודם, מחסנית Spring Security OAuth הציעה את האפשרות להקים שרת הרשאה כ- Application Spring. אך הפרויקט הוצא משימוש ואביב לא תומך בשרת הרשאות משלו נכון לעכשיו. במקום זאת, מומלץ להשתמש בספקים מבוססים קיימים כגון Okta, Keycloak ו- Forgerock.

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

6.2. תמיכת שרת משאבים OAuth2

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

 org.springframework.boot spring-boot-starter-oauth2-resource-server 

לקבלת מידע על הגרסה העדכנית ביותר, עבור אל Maven Central.

בנוסף, בתצורת האבטחה שלנו, עלינו לכלול את ה- oauth2ResourceServer () DSL:

@Configuration מחלקה ציבורית JWTSecurityConfig מרחיב את WebSecurityConfigurerAdapter {@Override מוגן ריק להגדיר (HttpSecurity http) זורק חריג {http ... .oauth2ResourceServer (oauth2 -> oauth2.jwt ()); ...}}

שרת המשאבים OAuth 2.0 שלנו עם Spring Security 5 נותן מבט מעמיק על נושא זה.

6.3. תמיכת לקוחות OAuth2

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

הנה התלות הספציפית לתמיכת לקוח OAuth2:

 org.springframework.boot spring-boot-starter-oauth2-client 

את הגרסה האחרונה ניתן למצוא ב- Maven Central.

Spring Security 5 מספק גם תמיכת כניסה מהשורה הראשונה דרך שלה oath2Login () DSL.

לפרטים על תמיכת SSO בערימה החדשה, עיין בכניסה יחידה פשוטה עם OAuth2 של Spring Security.

7. אבטחה של Spring Boot 2 לעומת Spring Boot 1 Security

בהשוואה למגף אביב 1, Spring Boot 2 פשט מאוד את התצורה האוטומטית.

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

Spring Boot 2 משתמש ברוב ברירות המחדל של Spring Security. בגלל זה, חלק מנקודות הקצה שלא היו מאובטחות כברירת מחדל באביב אתחול 1 מאובטחות כעת כברירת מחדל.

נקודות קצה אלה כוללות משאבים סטטיים כגון / css / **, / js / **, / images / **, / webjars / **, /**/favicon.ico, ונקודת הסיום של השגיאה. אם עלינו לאפשר גישה לא מאומתת לנקודות קצה אלה, אנו יכולים להגדיר זאת במפורש.

כדי לפשט את התצורה הקשורה לאבטחה, Spring Boot 2 הסיר את המאפיינים הבאים של Spring Boot 1:

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

8. מסקנה

במאמר זה התמקדנו בתצורת האבטחה המוגדרת כברירת מחדל שמספק Spring Boot. ראינו כיצד ניתן להשבית או לבטל את מנגנון התצורה האוטומטית של האבטחה וכיצד ניתן להחיל תצורת אבטחה חדשה.

קוד המקור של OAuth2 ניתן למצוא במאגר OAuth2 GitHub שלנו, למורשת ומחסנית חדשה. את שאר הקוד ניתן למצוא בהדרכות GitHub.


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