כניסה לטופס אבטחה באביב

1. הקדמה

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

2. התלות של Maven

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

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

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

3. האביב תצורת Java

נתחיל ביצירת מחלקת תצורה של Spring Security שמתרחבת מתאם WebSecurityConfigurer.

על ידי הוספה @EnableWebSecurity, אנו מקבלים תמיכה באביב אבטחה ושילוב MVC:

@Configuration @EnableWebSecurity המחלקה הציבורית SecSecurityConfig מרחיב את WebSecurityConfigurerAdapter {@Override מוגן חלל מוגדר (AuthenticationManagerBuilder auth) זורק Exception {// מנהל האימות (ראה להלן)} @Override מוגן בטל ריק (תצורת HttpSecurity http הסופית {) לבקשות הרשאה והתחברות לטופס (ראה להלן)}}

בדוגמה זו השתמשנו באימות בזיכרון והגדרנו 3 משתמשים.

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

בואו נבנה תחילה את מנהל האימות שלנו.

3.1. מנהל אימות

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

הגדר חלל מוגן (AuthenticationManagerBuilder auth סופי) זורק חריג {auth.inMemoryAuthentication () .withUser ("user1"). סיסמה (passwordEncoder (). קידוד ("user1Pass")). תפקידים ("USER"). ו- () .withUser ("user2"). סיסמה (passwordEncoder (). קידוד ("user2Pass")). תפקידים ("USER"). ו- () .withUser ("admin"). סיסמה (passwordEncoder (). קידוד ("adminPass") ) .roles ("מנהל"); }

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

החל באביב 5, עלינו להגדיר מקודד סיסמה. בדוגמה שלנו השתמשנו ב- BCryptPasswordEncoder:

@Bean PasswordEncoder הציבורי passwordEncoder () {להחזיר BCryptPasswordEncoder חדש (); }

לאחר מכן, בואו להגדיר את HttpSecurity.

3.2. תצורה לאישור בקשות

אנו מתחילים לעשות את התצורות הדרושות לאישור בקשות.

כאן אנו מאפשרים גישה אנונימית /התחברות כדי שמשתמשים יוכלו לאמת. הגבלה / מנהל ל מנהל תפקידים ואבטחת כל השאר:

התצורה הריקה מוגנת של @Override (HttpSecurity הסופי http) זורקת חריג {http .csrf (). השבת () .authorizeRequests () .antMatchers ("/ admin / **"). HasRole ("ADMIN") .antMatchers ("/ אנונימי * "). אנונימי () .antMatchers (" / login * "). permitAll () .anyRequest (). מאומת () .and () // ...}

שים לב שהסדר של antMatchers () אלמנטים משמעותיים - הכללים הספציפיים יותר צריכים להיות ראשונים, ואחריהם הכללים היותר כללים.

3.3. תצורה לכניסה לטופס

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

התצורה הריקה מוגנת של @Override (HttpSecurity הסופי http) זורקת חריג {http // ... .and () .formLogin () .loginPage ("/ login.html") .loginProcessingUrl ("/ perform_login") .defaultSuccessUrl ("/ homepage.html ", true) .failureUrl (" / login.html? error = true ") .failureHandler (authenticationFailureHandler ()). and () .logout () .logoutUrl (" / perform_logout ") .deleteCookies (" JSESSIONID " ) .logoutSuccessHandler (logoutSuccessHandler ()); }
  • loginPage () - דף הכניסה המותאם אישית
  • loginProcessingUrl () - כתובת ה- URL להגיש את שם המשתמש והסיסמה
  • defaultSuccessUrl () - דף הנחיתה לאחר כניסה מוצלחת
  • failureUrl () - דף הנחיתה לאחר כניסה לא מוצלחת
  • logoutUrl () - ההתנתקות המותאמת אישית

4. הוסף אבטחת אביב ליישום האינטרנט

כדי להשתמש בתצורת Spring Security המוגדרת לעיל, עלינו לצרף אותה ליישום האינטרנט.

נשתמש ב- WebApplicationInitializerאז אנחנו לא צריכים לספק כאלה web.xml:

מחלקה ציבורית AppInitializer מיישמת את WebApplicationInitializer {@Override public void onStartup (ServletContext sc) {AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext (); root.register (SecSecurityConfig.class); sc.addListener (ContextLoaderListener חדש (שורש)); sc.addFilter ("securityFilter", DelegatingFilterProxy חדש ("springSecurityFilterChain")) .addMappingForUrlPatterns (null, false, "/ *"); }}

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

5. תצורת ה- XML ​​של Spring Security

בואו נסתכל גם על תצורת ה- XML ​​המתאימה.

הפרויקט הכולל משתמש בתצורת Java, לכן עלינו לייבא את קובץ התצורה XML דרך Java @תְצוּרָה מעמד:

@Configuration @ImportResource ({"classpath: webSecurityConfig.xml"}) מחלקה ציבורית SecSecurityConfig {public SecSecurityConfig () {super (); }}

ותצורת ה- XML ​​לאבטחת האביב - webSecurityConfig.xml:

6. ה web.xml

לפני כניסתו של אביב 4, נהגנו להגדיר את תצורת אבטחת האביב ב- web.xml - רק פילטר נוסף שנוסף ל- MVC האביב הסטנדרטי web.xml:

אביב יישום מאובטח springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain / * 

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

7. טופס הכניסה

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

registry.addViewController ("/ login.html");

זה, כמובן, תואם את login.jsp:

מִשׁתַמֵשׁ:
סיסמה:

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

  • התחברות - כתובת האתר בה פורסם הטופס להפעלת תהליך האימות
  • שם משתמש - שם המשתמש
  • סיסמה - הסיסמא

8. הגדרת כניסה נוספת של האביב

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

אחת הסיבות לבטל את מרבית ברירות המחדל באבטחת אביב היא הסתיר את העובדה שהיישום מאובטח באמצעות Spring Security ולמזער את המידע שתוקף פוטנציאלי יודע על היישום.

מוגדר לחלוטין, אלמנט הכניסה נראה כך:

התצורה הריקה מוגנת של @Override (HttpSecurity http) זורקת חריג {http.formLogin () .loginPage ("/ login.html") .loginProcessingUrl ("/ perform_login") .defaultSuccessUrl ("/ דף הבית.html", נכון) .failureUrl ( "/login.html?error=true")}

או תצורת ה- XML ​​המתאימה:

8.1. דף הכניסה

לאחר מכן, בואו נראה כיצד נוכל להגדיר דף כניסה מותאם אישית באמצעות ה- שיטת loginPage ():

http.formLogin () .loginPage ("/ login.html")

לחלופין, באמצעות תצורת XML:

דף כניסה = '/ login.html'

אם לא נציין זאת, Spring Security תיצור טופס התחברות בסיסי מאוד ב- /התחברות כתובת אתר.

8.2. כתובת ה- POST לכניסה

כתובת ה- URL המוגדרת כברירת מחדל שבה כניסה האביב תפורסם כדי להפעיל את תהליך האימות /התחברות שהיה פעם / j_spring_security_check לפני אביב הביטחון 4.

אנחנו יכולים להשתמש ב- loginProcessingUrl שיטה לביטול כתובת אתר זו:

http.formLogin () .loginProcessingUrl ("/ perform_login")

לחלופין, באמצעות תצורת XML:

login-processing-url = "/ perform_login"

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

8.3. דף הנחיתה על הצלחה

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

אנו יכולים לבטל זאת באמצעות ה- defaultSuccessUrl () שיטה:

http.formLogin () .defaultSuccessUrl ("/ דף הבית.html")

או עם תצורת XML:

default-target-url = "/ homepage.html"

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

8.4. דף הנחיתה בכישלון

אותו דבר כמו בדף הכניסה, דף כישלון הכניסה יוצר באופן אוטומטי על ידי Spring Security ב /התחברות?שגיאה כברירת מחדל.

כדי לעקוף זאת, נוכל להשתמש ב- failureUrl () שיטה:

http.formLogin () .failureUrl ("/ login.html? error = true")

או עם XML:

authentication-failure-url = "/ login.html? error = true"

9. מסקנה

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

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

כאשר הפרויקט פועל באופן מקומי, ניתן לגשת אל ה- HTML לדוגמא בכתובת:

//localhost:8080/spring-security-mvc-login/login.html